gpt4 book ai didi

c++ - 具有 void 数据成员及其构造函数的类

转载 作者:行者123 更新时间:2023-11-27 22:56:52 25 4
gpt4 key购买 nike

我正在尝试编写在 Windriver linux(64 位)上运行的 C++ 应用程序。这是相似的代码:(我的部分代码是自动生成的,我尽力保持相似)

#include <stdio.h>

class OneClass{
const void *data;
public:
OneClass(const void *inData){

printf("In normal const %u addr: %u\n", *((unsigned int*)(inData)), inData);

data = inData;
}

OneClass(){
printf("In default const\n");
data = NULL;
}

OneClass(const OneClass &in){
printf("In copy const\n");

data = in.data;
}

const void* getData(){return data;}
};

OneClass create(const unsigned &in){
printf("In create before %u\n", in);
return new OneClass(&in);
}

main()
{
OneClass two = create(100);
unsigned int *value = (unsigned int*)two.getData();
printf("In main %u\n", *value);
}

输出是:

In create before 100
In normal const 100 addr: 4294339016
In normal const 4294339016 addr: 134520840
In main 4294339016

我预计 two.data 是 100,但实际上不是。如何?我还对普通构造函数如何调用两次而不是复制构造函数感到困惑?

谁能帮帮我?

最佳答案

构造函数 OneClass(const void*) 在您的 create 函数中被隐式调用。这是 C++ 的一个特性,允许隐式对象转换。

create 的返回类型是 OneClass。但是,您返回一个 new OneClass(&in)。这是一个指向对象的指针,而不是对象本身(它的类型是 OneClass*)。该指针被传递给 OneClass(const void*) 构造函数,并使用 OneClass* 指针创建另一个 OneClass。这就是您的构造函数被调用两次的原因。

使用 explicit 关键字限定单参数构造函数总是一个好主意,如下所示:

explicit OneClass(const void *inData)

现在,这段代码

OneClass create(const unsigned &in){
printf("In create before %u\n", in);
return new OneClass(&in);
}

将导致编译器错误,您可以捕获像这样的细微错误。


修改后的代码有效:

#include <cstdio> // you shouldn't include <stdio.h>, that's for C, not C++

class OneClass{
const void *data;
public:
explicit OneClass(const void *inData){
printf("In normal const %u addr: %p\n", // use the %p specifier to print pointers
*((unsigned int*)(inData)), inData);
data = inData;
}

OneClass(){
printf("In default const\n");
data = NULL;
}

OneClass(const OneClass &in){
printf("In copy const\n");

data = in.data;
}

const void* getData(){return data;}
};

OneClass* create(const unsigned &in){
printf("In create before %u\n", in);
return new OneClass(&in);
}

int main()
{
OneClass* two = create(100);
unsigned int *value = (unsigned int*)(*two).getData();
printf("In main %u\n", *value);
}

或者放弃动态内存分配(这会变得非常困惑,非常快)使用这个:

OneClass create(const unsigned &in){
printf("In create before %u\n", in);
return OneClass(&in);
}

int main()
{
OneClass two = create(100);
unsigned int *value = (unsigned int*)two.getData();
printf("In main %u\n", *value);
}

我建议你使用第二个。除非您特别需要用 new 分配一些东西,否则您不应该这样做。

关于c++ - 具有 void 数据成员及其构造函数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31934683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com