【问题标题】:Private member variable is null when passed from constructor to member function从构造函数传递给成员函数时,私有成员变量为空
【发布时间】:2015-03-15 02:39:03
【问题描述】:

我对 C++ 中的 OOP 还很陌生,所以请耐心等待。

在定义我的成员变量的标题中;

class AntibodyJunction
{
private:  
    //raw seq
    seqan::Dna5 _raw_sequence;
    //private funcs
    void _setVGeneQueryStartTranslation();

public:
    //V D and J constructor
    AntibodyJunction(AlignAntibody &, AlignAntibody &, AlignAntibody &, seqan::Dna5 &);
    ~AntibodyJunction() {};
};

在cpp中

AntibodyJunction::AntibodyJunction(AlignAntibody & VGene, AlignAntibody &JGene,AlignAntibody & DGene, seqan::Dna5 & raw_sequence)
{
    //...some other declaration...//
    seqan::Dna5String _raw_sequence = raw_sequence;
    std::cout <<  "constructor parameter\n" << raw_sequence << std::endl;
    std::cout << "Template dna5\n"  << _raw_sequence << std::endl;
    _setVGeneQueryStartTranslation();

};

void AntibodyJunction::_setVGeneQueryStartTranslation(){
    std::cout << "other raw seq\n" << _raw_sequence << std::endl;
    //...lots of other stuff
}

和输出 ->

constructor parameter
CAGCGATTAGTGGAGTCTGGGGG
Template dna5
CAGCGATTAGTGGAGTCTGGGGG
other raw seq

当我尝试在类函数中访问成员变量_raw_sequence 时,它是空白的。我知道我可以在构造函数中做所有事情,但我想了解它为什么会重置。 seqan::Dna5 只是 seqan 库中用于处理生物数据的 dna 字符串的模板容器。它拥有 dna 序列。 Here 是文档。这很令人困惑,因为我在此函数中访问的所有其他内容似乎都可用。

【问题讨论】:

  • seqan::Dna5String _raw_sequence = raw_sequence; 这将创建一个名为 _raw_sequence 的局部变量,该变量在构造函数返回时被销毁。你的意思是把它存储在成员变量_raw_sequence中吗?
  • 哦,所以它应该只是_raw_sequence = raw_sequence?如果我声明一个类型它会覆盖?
  • 是的。或者使用初始化列表。如果引用参数没有被构造函数修改,您还应该将引用参数声明为 const。
  • 添加类型使其成为带有初始化程序的变量声明,而不是赋值。如果您在作用域中声明一个新变量,它将隐藏外部作用域中的变量,在本例中为类作用域。无论如何,您都使用了错误的语法。成员变量应通过构造函数上的初始值列表进行初始化。
  • 如果有人想添加为答案,我很乐意标记

标签: c++ class oop member-functions seqan


【解决方案1】:

如上所述,您在构造函数中实例化一个 _raw_sequence 变量,而不是像这样引用您的成员变量:

this->_raw_sequence = raw_sequence ; //this pointer used to indicate member var

我建议以后通过初始化列表来初始化成员变量以避免此类问题。你可以这样重写你的构造函数:

AntibodyJunction::AntibodyJunction( const AlignAntibody & VGene, const AlignAntibody &JGene, const AlignAntibody & DGene,const  seqan::Dna5 & raw_sequence)
: _raw_sequence(raw_sequence)
{
//....
};

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2016-11-15
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多