继承与组合.基类有一个指向派生类的指针



我想知道我是否可以有两个类看起来像这样:

//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()'的成员"。解决办法是什么?

下面应该可以工作,但是,您应该以这种方式构造类,基类应该真正具有派生类类型的成员。

然而,由于成员只是一个指针,代码应该仍然可以编译和工作,无论你要求错误。

你的代码的问题是类Small必须在你创建类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的成员类型,您最好像下面这样创建单个类,使用您的代码的唯一原因是您可以使用没有定义或使用Small的Little代码。但是,在这种情况下,您最好使用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一个指针

最新更新