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

C++ 我可以使用C+;中的函数初始化类成员变量吗+;?如果是,怎么做?,c++,C++,我尝试使用StructureMaker类函数中的函数初始化结构类的成员变量。它给出了错误。有什么问题吗?我不能这样做吗?那怎么办呢 MyMemberNotToInitThroughConstructor.h #ifndef MYMEMBERNOTTOINITTHROUGHCONSTRUCTOR_H_ #define MYMEMBERNOTTOINITTHROUGHCONSTRUCTOR_H_ namespace my { class MyMemberNotToInitThroughConst

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

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_ */
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;
}
#包括
#包括
#包括“StructureMaker.h”
#包括“Structure.h”
使用名称空间std;
使用我的名称空间;
int main()
{
StructureMaker stm;
结构*st;
stm.makeStructure(st);

//cout member->no问题在于以下功能:

void StructureMaker::innerMake(Structure*st)
{
    int no1 = 987;
    MyMemberNotToInitThroughConstructor my(no1);
    st->setElements2(&my);
}
my
是函数中的一个局部变量。您正在将
st
的成员变量设置为指向该局部变量的指针。一旦该函数返回,指针将无效,如果您试图使用该指针访问其成员变量或调用成员函数,您将遇到未定义的行为territory

最好从堆中分配一个对象并使用它

void StructureMaker::innerMake(Structure*st)
{
    int no1 = 987;
    st->setElements2(new MyMemberNotToInitThroughConstructor(no1));
}
请记住,
Structure
并没有接管管理该指针的职责。您必须确保将内存释放到
Structure
中的某个位置。对于这样的类,您需要确保有一个复制构造函数和一个复制赋值操作符,它们能够正确执行操作


建议绝对必须阅读:

问题在于以下功能:

void StructureMaker::innerMake(Structure*st)
{
    int no1 = 987;
    MyMemberNotToInitThroughConstructor my(no1);
    st->setElements2(&my);
}
my
是函数中的一个局部变量。您正在将
st
的成员变量设置为指向该局部变量的指针。一旦该函数返回,指针将无效,如果您试图使用该指针访问其成员变量或调用成员函数,您将遇到未定义的行为territory

最好从堆中分配一个对象并使用它

void StructureMaker::innerMake(Structure*st)
{
    int no1 = 987;
    st->setElements2(new MyMemberNotToInitThroughConstructor(no1));
}
请记住,
Structure
并没有接管管理该指针的职责。您必须确保将内存释放到
Structure
中的某个位置。对于这样的类,您需要确保有一个复制构造函数和一个复制赋值操作符,它们能够正确执行操作


建议绝对必须阅读:

您试图实现什么?您遇到的错误是什么?我在eclipse中使用CDT插件。它说只有program.exe停止工作。没有更多信息可用。严格来说,没有。所有成员变量都是在您构造类时初始化的。您只能分配给em.你想实现什么?你遇到了什么错误?我在eclipse中使用CDT插件。它说只有program.exe停止工作。没有更多信息可用。严格地说,没有。所有成员变量都是在你构造类时初始化的。你只能分配给它们。