如果 类 分为单独的文件,则不调用默认构造函数
Default constructor not called if classes devided into separate files
更新:
现在我有了这个,但它没有编译:
A.h:
#ifndef A_H
#define A_H
class A {
private:
int foo;
public:
A();
int getfoo();
};
#endif
A.cpp:
#include "A.h"
A::A() {
foo = 5;
}
int A::getfoo(){
return foo;
}
B.h:
#ifndef B_H
#define B_H
class B {
private:
A myA;
public:
B();
int getAvalue();
};
#endif
B.cpp:
#include "A.h"
#include "B.h"
int B::getAvalue(){
return myA.getfoo();
}
错误:
b.h line 6: C2146: missing ';' before identifier 'myA'
b.h line 6: C4430: missing type specifier - int assumed
b.h line 6: C4430: missing type specifier - int assumed
更新结束
我在不同的 cpp 和头文件中写了 2 classes:class A 和 class B。
Class B 使用 class A 作为私有变量,并且永远不会调用 class A 的默认构造函数。
这是我的代码:
A.h:
class A {
public:
A();
int getfoo();
};
A.cpp:
class A {
private:
int foo;
public:
A();
int getfoo();
};
A::A() {
foo = 5;
}
int A::getfoo(){
return foo;
}
B.h:
class B {
public:
int getAvalue();
};
B.cpp:
#include "A.h"
class B {
private:
A myA;
public:
int getAvalue();
};
int B::getAvalue(){
return myA.getfoo();
}
classtest.cpp:
#include "stdafx.h"
#include <iostream>
#include "B.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
B stackB;
cout << stackB.getAvalue() << endl;
B* storeB = new B();
cout << storeB->getAvalue() << endl;
cin.get();
return 0;
}
输出永远不会是 5 并且永远不会触发构造函数 A::A() 中的断点。我是在全局还是在本地使用 B 都没有关系。如果我将 classes 和函数放在一个文件中,这个示例工作得很好。
如果我向 class B 添加一个空的默认构造函数,则会调用 class A 的默认构造函数,但随后 Visual Studio 2008 会抱怨变量 stackB 周围的堆栈损坏。
我做错了什么?
仅此 class:
A.h:
class A {
public:
A();
int getfoo();
};
A.cpp:
class A {
private:
int foo;
public:
A();
int getfoo();
};
A::A() {
foo = 5;
}
int A::getfoo() {
return foo;
}
您在 A.h
中声明 class A
。
然后在您的实现 (cpp) 文件中,您再次声明 class A
。
您还忘记在 A.cpp
中包含 A.h
。如果您将 header 包含在 cpp 中;编译器会抛出错误告诉你出了什么问题。您还缺少 header 守卫或 pragma 指令。
您的 class 应该如下所示:
A.h
#ifndef A_H
#define A_H
class A {
private:
int foo;
public:
A();
int getFoo() const; // const to return member and prevents modification
};
#endif // !A_H
A.cpp
#include "A.h" // you forgot to include the header
A::A() : // class constructor using it's member initializer list
foo( 5 ) {
}
int A::getFoo() const {
return foo;
}
现在,一旦您修复了 class,那么在 class B 上工作应该不是问题。但是,将一个 class 的 header 文件包含到另一个 class 文件时,需要注意一件事;你最终可以得到循环包含。防止这种情况的最佳方法是在 header 中使用 class 原型并将其 header 包含在包含 class 的 cpp 文件中。在某些情况下 class 原型类型不起作用,但我会把它留给您进行研究。
How to use Class Prototype in C++
Class B 可能是这样的:
B.h
#ifndef B_H
#define B_H
// #include "A.h" // uncomment this if prototype below doesn't work.
class A; // class prototype may not work in all cases;
// If the above prototype does not work; comment it out
// and replace it with #include "A.h".
class B {
private:
A myA;
public:
B(); // remove default
int getAValue() const;
};
#endif // !B_H
B.cpp
#include "B.h"
#include "A.h" // If class A's prototype in the header does not work
// then comment this out and place it in this class B's header by
// replacing it with the prototype.
B::B() {} // default constructor (should make this complete type)
int B::getAValue() const {
return myA.getFoo();
}
这应该有助于解决您的问题。如果使用 class 原型在 header 中不起作用,因为在某些情况下它可能不起作用;您可以从 header 中删除原型声明并将其替换为 class 的 include 指令并从 cpp 文件中删除其包含。
更新:
现在我有了这个,但它没有编译: A.h:
#ifndef A_H
#define A_H
class A {
private:
int foo;
public:
A();
int getfoo();
};
#endif
A.cpp:
#include "A.h"
A::A() {
foo = 5;
}
int A::getfoo(){
return foo;
}
B.h:
#ifndef B_H
#define B_H
class B {
private:
A myA;
public:
B();
int getAvalue();
};
#endif
B.cpp:
#include "A.h"
#include "B.h"
int B::getAvalue(){
return myA.getfoo();
}
错误:
b.h line 6: C2146: missing ';' before identifier 'myA'
b.h line 6: C4430: missing type specifier - int assumed
b.h line 6: C4430: missing type specifier - int assumed
更新结束
我在不同的 cpp 和头文件中写了 2 classes:class A 和 class B。 Class B 使用 class A 作为私有变量,并且永远不会调用 class A 的默认构造函数。 这是我的代码:
A.h:
class A {
public:
A();
int getfoo();
};
A.cpp:
class A {
private:
int foo;
public:
A();
int getfoo();
};
A::A() {
foo = 5;
}
int A::getfoo(){
return foo;
}
B.h:
class B {
public:
int getAvalue();
};
B.cpp:
#include "A.h"
class B {
private:
A myA;
public:
int getAvalue();
};
int B::getAvalue(){
return myA.getfoo();
}
classtest.cpp:
#include "stdafx.h"
#include <iostream>
#include "B.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
B stackB;
cout << stackB.getAvalue() << endl;
B* storeB = new B();
cout << storeB->getAvalue() << endl;
cin.get();
return 0;
}
输出永远不会是 5 并且永远不会触发构造函数 A::A() 中的断点。我是在全局还是在本地使用 B 都没有关系。如果我将 classes 和函数放在一个文件中,这个示例工作得很好。
如果我向 class B 添加一个空的默认构造函数,则会调用 class A 的默认构造函数,但随后 Visual Studio 2008 会抱怨变量 stackB 周围的堆栈损坏。
我做错了什么?
仅此 class:
A.h:
class A { public: A(); int getfoo(); };
A.cpp:
class A { private: int foo; public: A(); int getfoo(); }; A::A() { foo = 5; } int A::getfoo() { return foo; }
您在 A.h
中声明 class A
。
然后在您的实现 (cpp) 文件中,您再次声明 class A
。
您还忘记在 A.cpp
中包含 A.h
。如果您将 header 包含在 cpp 中;编译器会抛出错误告诉你出了什么问题。您还缺少 header 守卫或 pragma 指令。
您的 class 应该如下所示:
A.h
#ifndef A_H
#define A_H
class A {
private:
int foo;
public:
A();
int getFoo() const; // const to return member and prevents modification
};
#endif // !A_H
A.cpp
#include "A.h" // you forgot to include the header
A::A() : // class constructor using it's member initializer list
foo( 5 ) {
}
int A::getFoo() const {
return foo;
}
现在,一旦您修复了 class,那么在 class B 上工作应该不是问题。但是,将一个 class 的 header 文件包含到另一个 class 文件时,需要注意一件事;你最终可以得到循环包含。防止这种情况的最佳方法是在 header 中使用 class 原型并将其 header 包含在包含 class 的 cpp 文件中。在某些情况下 class 原型类型不起作用,但我会把它留给您进行研究。
How to use Class Prototype in C++
Class B 可能是这样的:
B.h
#ifndef B_H
#define B_H
// #include "A.h" // uncomment this if prototype below doesn't work.
class A; // class prototype may not work in all cases;
// If the above prototype does not work; comment it out
// and replace it with #include "A.h".
class B {
private:
A myA;
public:
B(); // remove default
int getAValue() const;
};
#endif // !B_H
B.cpp
#include "B.h"
#include "A.h" // If class A's prototype in the header does not work
// then comment this out and place it in this class B's header by
// replacing it with the prototype.
B::B() {} // default constructor (should make this complete type)
int B::getAValue() const {
return myA.getFoo();
}
这应该有助于解决您的问题。如果使用 class 原型在 header 中不起作用,因为在某些情况下它可能不起作用;您可以从 header 中删除原型声明并将其替换为 class 的 include 指令并从 cpp 文件中删除其包含。