访问稍后在C ++中定义的类的成员

时间:2018-03-28 16:48:50

标签: c++

我收到了错误:

/Users/apple/Desktop/c.cpp:9:3: error: member access into incomplete type 'const World'
        w.name;
         ^
/Users/apple/Desktop/c.cpp:6:7: note: forward declaration of 'World'
class World;
      ^
1 error generated.
运行时

#include <string>
#include <iostream>

using namespace std;
class World;

void show_name(const World& w) {
    cout << w.name << endl;
    return;
}

class World {
public:
    string name;
};

以下链接提供了使用稍后定义的类类型的方法

Defining a class member with a class type defined later in C++

但是如果我想访问稍后定义的类的成员并且我坚持在类的定义之前定义这个调用函数,就像我使用的例子那样。

1 个答案:

答案 0 :(得分:2)

你做不到。对已声明但未定义的类的任何使用都不能访问其内部或使用它们的任何知识,例如大小或布局。您可以使用World*World&,但不得以任何方式取消引用它们。

处理这种情况的常用方法是在头文件中定义类。该定义必须定义所有成员变量并声明成员函数,但不需要定义这些函数。现在,编译器知道类的内部结构,并可以相应地使用它。

以下是一个类的可见性如何影响你可以用它做什么的一个例子。

class World;

void func(const World& w) {
    std::cout << w; // Okay, only uses reference
    std::cout << w.name; // error
    World w2 = w1; // error, compiler needs to know that class offers copy constructor
    w.do_something(); // error, compiler doesn't know what this is
}

class World {
public:
    std::string name;

    void do_something() const; // Doesn't need implementation to be called
}

std::ostream& operator<<(std::ostream s, const World& w) {
    std::cout << w.name; // OK
    w.do_something(); // OK
    return s;
}

请注意,World::do_something()需要在某处定义,但这甚至可以是单独的翻译单元。此机制允许在.h文件中定义类,并在.cpp文件中定义其方法。如果项目中没有定义,则不会出现编译器错误,但会出现链接器错误。