Наследование и комбинация - базовый класс имеет указатель на производный класс - PullRequest
2 голосов
/ 09 июля 2011

Мне интересно, могу ли я сделать так, чтобы два класса выглядели так:

//file: Small.h
#pragma once
#include "Little.h"

class Small :
    public Little
{
public:
    Small(void){}
    ~Small(void){}

};

и

//file: Little.h
#pragma once
#include <iostream>
#include "Small.h"

using namespace std;

//class Small;
class Little
{
public:
    Little(){ s = 0; }
    void print(){ cout << "oops!" << endl; }
    Small* s; 
};

А теперь моя проблема: когда я хочу создать объект типа «Small» и вызвать его функцию «print ()», VS-2010 говорит, что «в классе« Small »нет члена с именем print ()». Какое решение?

1 Ответ

0 голосов
/ 09 июля 2011

Следующее должно работать, однако вы должны создавать классы таким образом, базовый класс должен действительно иметь член типа производного класса.

Однако, поскольку член является просто указателем,код должен все еще компилироваться и работать, однако вы просите об ошибках.

Проблема с вашим кодом заключается в том, что класс Small должен быть определен до того, как вы создадите класс Little and Little, если вы создадите Small

Вы должны сделать это в одном файле следующим образом, так как они взаимозависимы

//file: SmallLittle.h
#pragma once
#include <iostream>

using namespace std;

class Small;

class Little
{
public:
    Little(){ s = 0; }
    void print(){ cout << "oops!" << endl; }
    Small* s; 
};

class Small :
    public Little
{
public:
    Small(void){}
    ~Small(void){}

};

Однако, поскольку Small является типом элемента Little, вам, вероятно, лучше создать отдельный класс следующим образом. Единственная причина для использованияВаш код таков, что вы можете использовать код Little, в котором Small не определен или не используется.Однако в этом случае лучше использовать тип void * для указателя.

как следует

//file: Small.h
#pragma once
#include <iostream>

using namespace std;

class Small;

class Small
{
public:
    Small(){ s = 0; }
    void print(){ cout << "oops!" << endl; }
    Small* s; 
    ~Small(void){}
};

Кроме того, вам не нужно устанавливать s в 0, так какэто NULL, которое должно быть значением до тех пор, пока вы не создадите указатель, используя new или assign указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...