我可以使用C++中的函数初始化类成员变量吗?如果是,该怎么做
Can I initialize a class member variable using function in C++? If so how to do it?
我试图使用StructureMaker类函数中的函数初始化Structure类的成员变量。它给出了错误。它有什么问题?我不能这么做吗?那该怎么做呢?
MyMemberNotToInitSthroughConstructor.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_ */
MyMemberNotToInitSthroughConstructor.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_ */
Structure.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_ */
StructureMaker.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 */
Test.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
中的某个位置释放内存。对于这样的类,您需要确保您有一个复制构造函数和一个复制赋值运算符来做正确的事情。
建议绝对必读:三条规则
相关文章:
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 如果非动态变量被指针引用,何时超出范围?
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 如果我注释掉换行符,为什么'string'会成为一个不合格的变量
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 检查私有成员变量是否在一定范围内,如果没有调整
- 如果用户输入在整数变量中浮动怎么办?
- 如果变量未初始化,Visual Studio 2017 不会生成任何警告
- 如果变量在 .h 文件中定义为"static "怎么办?
- 如果变量的值发生更改,则恢复程序
- 这段代码有什么问题?如果变量是字母,我无法测试名为数字的变量
- 如果变量C++为真或假
- 如果变量的值在编译时已知/未知,则特殊化
- 如果变量的值为零,C++应避免将其传递给std::cout