是否可以在类标题中添加类的对象?

时间:2010-01-18 07:22:29

标签: c++

我想知道是否有办法将一个类的对象放在标题中?

例如:

class MyClass {

} object;  

如果我在那里制作了一个对象,然后在多个源文件中包含标题,我会发现找到多个定义符号的错误。我很新,所以不完全理解一切。

另外,我想在不同的函数中执行类似object.function()的操作,这是另一个类的成员,我该怎么办?

5 个答案:

答案 0 :(得分:4)

假设您想要一个对象,在头文件中只声明对象:

extern blabla object;

然后在一个源文件中定义它:

blabla object;

至于从不同的类调用对象的方法,只要该方法是公共的,这就完全没问题。

class foo
{
public:
    void public_method();

private:
    void private_method();
};


void some_other_class::method(foo &f)
{
    f.public_method();  // this is fine

    f.private_method(); // this is not okay, private_method can only be called from
                        // within foo
}

还有第三个可见性(受保护),一旦你开始处理继承就会发挥作用。

答案 1 :(得分:1)

您可以找到方法(参见其他答案),但不要这样做。正如您所说,您是C ++的新手,因此更好地学习良好实践,并在需要全局对象时 - 在源(cpp)文件中创建它们。

除此之外,尽量避免使用全局对象,并在类或函数中定义对象。

答案 2 :(得分:0)

将定义放在头文件中并不是一个好习惯,因为这会导致您遇到的错误。虽然有办法绕过这个(外部,头部防护),但应尽可能避免。请记住,在头文件中放置声明,在源文件中定义。

答案 3 :(得分:0)

关于你的第二个问题注释,你也可以使用::运算符和类名称(没有实例)调用静态方法:

void AnOtherClass::method()
{
    TheFirstClass::static_method();
}

答案 4 :(得分:-1)

如果符合您的需要,您还可以使用singleton模式。

第二个问题。您始终可以将类对象作为要从中调用object.function()的类的(私有)成员变量。

例如:

// File a.h, includeguards etc. left out for clarity
class A {
public:
   void func();
};

// File b.h
#include "a.h"
class B {
public:
   void func();
private:
   A object;
};

// File b.c
#include "b.h"
void B::func()
{
   object.func();
}

希望有所帮助。