[英]Can I initialize a class member variable using function in C++? If so how to do it?
我嘗試使用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_ */
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 */
測試版
#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
某個位置。 對於此類,您需要確保具有正確執行操作的副本構造函數和副本賦值運算符。
建議絕對閱讀: 三法則
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.