Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以在类标题中添加类的对象?_C++ - Fatal编程技术网

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

C++ 是否可以在类标题中添加类的对象?,c++,C++,我想知道是否有办法将类的对象放入头中 例如: class MyClass { } object; // 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 #includ

我想知道是否有办法将类的对象放入头中

例如:

class MyClass {

} object;  
// 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();
}
如果我在那里创建了一个对象,然后将头包含在多个源文件中,我会发现一个错误,即找到了多个定义的符号。我是新来的,所以不完全了解一切


另外,我想在另一个函数中执行类似object.function的操作,该函数是另一个类的成员。如何执行该操作?

假设您需要单个对象,则在头文件中仅声明该对象:

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
}

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

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

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
}

还有第三个可见性保护,一旦你开始处理继承问题,它就开始发挥作用。

你可以找到方法,看看其他答案,但不要这样做。正如你所说的,C++是新的,所以最好学习好的实践,当你需要全局对象时,在源CPP文件中创建它们。p>
除此之外,尽量避免使用全局对象,并在类或函数中定义对象。

你可以找到方法,看看其他答案,但不要这样做。正如你所说的,C++是新的,所以最好学习好的实践,当你需要全局对象时,在源CPP文件中创建它们。p>
除此之外,尽量避免使用全局对象,并在类或函数中定义对象。

如果这种模式适合您的需要,您也可以使用该模式

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

例如:

class MyClass {

} object;  
// 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();
}

希望能有所帮助。

如果这种模式适合您的需要,您也可以使用它

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

例如:

class MyClass {

} object;  
// 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();
}

希望这会有所帮助。

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

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

关于第二个问题说明,您还可以使用::运算符和类名调用静态方法,而不使用实例:

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

关于第二个问题,您还可以使用::运算符和类名调用静态方法,而不使用实例:

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

我根本不推荐单例模式;没有需要的情况。嗯,谢谢-你的评论让我在谷歌上搜索了大量的赞成和反对意见,在搜索和阅读了许多文章后,我发现了一个很好的维基讨论,有很多有趣的评论和链接:。我的结论是:在你使用它之前,好好考虑一下。但有时确实有道理。你是对的,它在任何地方都不是必需的,但是没有模式也是如此;没有需要的情况。嗯,谢谢-你的评论让我在谷歌上搜索了大量的赞成和反对意见,在搜索和阅读了许多文章后,我发现了一个很好的维基讨论,有很多有趣的评论和链接:。我的结论是:在你使用它之前,好好考虑一下。但有时确实有道理。你是对的,它在任何地方都不需要——但没有模式也是如此。