我可以使用C++中的函数初始化类成员变量吗?如果是,该怎么做

Can I initialize a class member variable using function in C++? If so how to do it?

本文关键字:如果 变量 成员 C++ 可以使 初始化 函数 我可以      更新时间:2023-10-16

我试图使用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中的某个位置释放内存。对于这样的类,您需要确保您有一个复制构造函数和一个复制赋值运算符来做正确的事情。

建议绝对必读:三条规则

相关文章: