gpt4 book ai didi

c++ - 我可以在 C++ 中使用函数初始化类成员变量吗?如果是这样怎么办?

转载 作者:太空宇宙 更新时间:2023-11-04 13:25:44 24 4
gpt4 key购买 nike

我尝试使用 StructureMaker 类函数中的函数来初始化 Structure 类的成员变量。它给出了错误。它有什么问题?我不能这样做吗?那怎么办呢?

MyMemberNotToInitThroughConstructor.h

#ifndef MYMEMBERNOTTOINITTHROUGHCONSTRUCTOR_H_
#define MYMEMBERNOTTOINITTHROUGHCONSTRUCTOR_H_

namespace my {

class MyMemberNotToInitThroughConstructor {
public:
MyMemberNotToInitThroughConstructor(int no1);
virtual ~MyMemberNotToInitThroughConstructor();

//private:
int no;
};

} /* namespace my */

#endif /* MYMEMBERNOTTOINITTHROUGHCONSTRUCTOR_H_ */

MyMemberNotToInitThroughConstructor.cpp

#include "MyMemberNotToInitThroughConstructor.h"

namespace my {

MyMemberNotToInitThroughConstructor::MyMemberNotToInitThroughConstructor(int no1) {
no = no1;
}

MyMemberNotToInitThroughConstructor::~MyMemberNotToInitThroughConstructor() {
// TODO Auto-generated destructor stub
}

} /* namespace my */

结构.h

#ifndef STRUCTURE_H_
#define STRUCTURE_H_

#import "MyMemberNotToInitThroughConstructor.h"

namespace my {

class Structure {
public:
Structure();
void setElements1(int id1);
void setElements2(MyMemberNotToInitThroughConstructor* member1);
virtual ~Structure();

//private:
int id;
MyMemberNotToInitThroughConstructor*member;
};

} /* namespace my */

#endif /* STRUCTURE_H_ */

结构.cpp

#include "Structure.h"

namespace my {

Structure::Structure() {
}

void Structure::setElements1(int id1)
{
id = id1;
}
void Structure::setElements2(MyMemberNotToInitThroughConstructor* member1)
{
member = member1;
}

Structure::~Structure() {
// TODO Auto-generated destructor stub
}

} /* namespace my */

StructureMaker.h

#ifndef STRUCTUREMAKER_H_
#define STRUCTUREMAKER_H_

#import "Structure.h";
#import "MyMemberNotToInitThroughConstructor.h"

namespace my {

class StructureMaker {
public:
StructureMaker();
void makeStructure(Structure*st);
void innerMake(Structure*st);
virtual ~StructureMaker();
};

} /* namespace my */

#endif /* STRUCTUREMAKER_H_ */

结构制作器.cpp

#include "StructureMaker.h"

namespace my {

StructureMaker::StructureMaker() {
// TODO Auto-generated constructor stub

}

void StructureMaker::makeStructure(Structure*st)
{
int id1 = 123;
st->setElements1(id1);
innerMake(st);
}

void StructureMaker::innerMake(Structure*st)
{
int no1 = 987;
MyMemberNotToInitThroughConstructor my(no1);
st->setElements2(&my);
}

StructureMaker::~StructureMaker() {
// TODO Auto-generated destructor stub
}

} /* namespace my */

测试.cc

#include <stdio.h>
#include<iostream>
#include"StructureMaker.h"
#include"Structure.h"

using namespace std;
using namespace my;

int main()
{
StructureMaker stm;
Structure*st;
stm.makeStructure(st);
//cout << st->member->no << endl;
return 0;
}

最佳答案

问题出在下面这个函数上:

void StructureMaker::innerMake(Structure*st)
{
int no1 = 987;
MyMemberNotToInitThroughConstructor my(no1);
st->setElements2(&my);
}

my 是函数中的局部变量。您正在将 st 的成员变量设置为指向该局部变量的指针。一旦那个函数返回,指针就失效了,如果你试图用那个指针来访问它的成员变量或者用它来调用一个成员函数,你就会遇到未定义的行为领域。

从堆中分配一个对象并使用它会更好。

void StructureMaker::innerMake(Structure*st)
{
int no1 = 987;
st->setElements2(new MyMemberNotToInitThroughConstructor(no1));
}

请记住,Structure 尚未接管管理该指针的责任。您必须确保在 Structure 中的某处释放内存。对于这样的类,您需要确保您有一个复制构造函数和一个执行正确操作的复制赋值运算符。

推荐必读:The Rule of Three

关于c++ - 我可以在 C++ 中使用函数初始化类成员变量吗?如果是这样怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33448571/

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