我想写一些我正在编写的库的单元测试
我有一个看起来像这样的课程:
class A
{
public:
A(B* pB)
// construction details, involves my library
// but ultimately there is a new being done ,)
B* m_pB;
};
Run Code Online (Sandbox Code Playgroud)
我想检查指针m_pB是否实际初始化,所以我沿着这些方向做了一些事情:
A* p = // creation of this object involves my library
BOOST_REQUIRE( p->m_pB != NULL );
Run Code Online (Sandbox Code Playgroud)
但它发生了g ++没有对内存进行零初始化,因此值p->m_pB只是随机的.当我new对象时,有没有办法强制g ++为我初始化这个内存?
我相信Visual Studio会根据特定代码执行类似的操作,具体取决于内存的分配位置.
编辑:我现在可以想到2个备份解决方案:使用智能指针,或编写新的运算符......
可能重复:
类型名称后的括号是否与new有所不同?
我相信这个问题已经被问到了,但我找不到快速搜索.
Foo ob* = new Foo;
Foo ob* = new Foo();
Run Code Online (Sandbox Code Playgroud)
这两种在C++中创建对象的方法有区别吗?如果没有,那么其中一个被认为是不好的做法?每个编译器都会对它进行相同的处理吗?
www.fredosaurus.com 说明这一点:
创建类的对象时,C++会调用该类的构造函数.如果没有定义构造函数,C++将调用默认构造函数,该构造函数为对象分配内存,但不初始化它.
但我认为构造函数只负责初始化数据成员.我的理解不正确吗?
可能重复:
void main和int main之间的区别?
好吧,所以我正在使用流血的编译器,我应该注意的第一件事是我使用2001版C++作为绝对的初学者,自2001年以来C++是否有任何改变会影响本书的有效性?我问,因为我知道php有php5,现在是php6,但我还没有看到任何C++ 03.
现在我之所以这么说,在它使用的代码中,
void main (void)
Run Code Online (Sandbox Code Playgroud)
为什么我要一个论证无效?这是做什么的.
但是当我void main (void)在我的编译器中运行时,它说main必须在它之前有一个"int".所以我不能有"无效"主(无效);
此外,一旦代码运行,只要没有"cin",程序就会关闭.这是正常的行为,除了在我的程序结束时制作一个cin之外,还有更好的方法来阻止它吗?
#include <iostream>
using std::cout;
using std::endl;
class Base
{
public :
void f();
void g();
int mBaseData1;
};
class Derived : public Base
{
public :
int mDerivedData1;
};
void main()
{
Base* base = new Base();
Derived* derived = (Derived*)(base); // DownCast
derived->mDerivedData1 = 6;
cout<< derived->mDerivedData1<<endl; // Result = 6;
}
Run Code Online (Sandbox Code Playgroud)
在此代码中 new base()分配堆中的内存
并将Derived* derived = (Derived*)(base)基数转换为派生的
我们如何使用mDerivedData1?我无法找到为mDerivedData1分配内存的位置,或者当我们调用Derived的构造函数来分配mDerivedData1时?
我有两种方法来为指针创建实例.但其中一个会失败.
class A {
public:
int num;
};
void testPointer1(A* a){
a = new A();
a->num = 10;
}
A* testPointer2(){
A* a = new A();
a->num = 10;
return a;
}
void testPointer() {
A* a1 = NULL;
testPointer1(a1); // this one fails
//cout << a1->num << endl; // segmentation fault
A* a2 = NULL;
a2 = testPointer2();
cout << a2->num << endl;
}
Run Code Online (Sandbox Code Playgroud)
为什么testPointer1错了?
创建对象的以下两种方法有什么区别?
Test* t = new Test();
Run Code Online (Sandbox Code Playgroud)
和
Test* t;
Run Code Online (Sandbox Code Playgroud)
你对第二个样本的答案与我认为它会做的事情相匹配(没有创建对象)但是
class Test {
public:
void bla(void) {
std::cout << "test" << std::endl;
};
};
int main(void) {
Test* test;
test->bla();
}
Run Code Online (Sandbox Code Playgroud)
给我输出"测试"......所以实际上有一个对象
很多次,我在C++代码指针中看到了结构的分配;
struct Current{
int amp;
};
Current *cur = new Current();
Run Code Online (Sandbox Code Playgroud)
但是,"Current"是一个结构而不是类,但在C++中受支持.如何使用它来代替C类型分配,如下所示:
Current *cur = (Current*) malloc (sizeof(Current));
Run Code Online (Sandbox Code Playgroud)
这背后的基本概念是什么?我所知道的是,"结构"在C++中被认为是"类".
已知C++中struct-VS-class的概念.查询主要是关于具体的用例,因为两者都是允许的,但是应该优先考虑,为什么?