簡體   English   中英

我可以使用C ++中的函數來初始化類成員變量嗎? 如果可以,該怎么辦?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM