无法在c ++中构造复杂的结构

时间:2010-01-07 06:53:38

标签: c++ data-structures

我有两个基本结构如下:

struct stuSectionProperties
{

    int Field1; // Row | BoxNo   | SplitterNo
    int Field2; // Col | Adapter |     -
    double Latitude;
    bool IsEast;
    int Band;
    int CableNo;
    SDP::Global::enuSections::Type Section;

    stuSectionProperties()
    {
        this->Field1 = -1;
        this->Field2 = -1;
        this->Latitude = -1;
        this->Band = -1;
        this->Section = SDP::Global::enuSections::None;
        this->CableNo = -1;
    }
    const char* toStr()
    {
        return ((QString) (QString::number(this->Field1) + " , " + QString::number(this->Field2) + " , " + QString::number(Latitude) + " , " + QString::number(IsEast) + " , " + QString::number(Band) + " , "
                        + QString::number((int) Section) + QString::number((int) CableNo))).toStdString().c_str();
    }
};

struct stuSearchResult
{
    stuSectionProperties MyData;
    QList<stuSectionProperties> Connections;

    stuSearchResult()
    {
        this->MyData.Field1 = -1;
        this->MyData.Field2 = -1;
        this->MyData.Latitude = -1;
        this->MyData.Band = -1;
        this->MyData.Section = SDP::Global::enuSections::None;
        this->MyData.CableNo = -1;

        stuSectionProperties stuDummy;
        stuDummy.Band=-1;
        stuDummy.CableNo=-1;
        stuDummy.Field1=-1;
        stuDummy.Field2=-1;
        stuDummy.IsEast=-1;
        stuDummy.Latitude=-1;

        stuDummy.Section= SDP::Global::enuSections::None;
        this->Connections.append(stuDummy);

    }
    const char * toStr()
    {
        return ((QString) (QString::number(this->MyData.Field1) + " , " + QString::number(this->MyData.Field2) + " , " + QString::number(this->MyData.Latitude) + " , " + QString::number(this->MyData.IsEast) + " , " + QString::number(this->MyData.Band) + " , "
                        + QString::number((int) this->MyData.Section) + QString::number((int) this->MyData.CableNo)) + " , " + QString::number(this->Connections[0].Field1) + " , " + QString::number(this->Connections[0].Field2) ).toStdString().c_str();
    }
};

每当我尝试从第二个结构创建一个实例然后尝试调用它的toStr()成员时,我会得到一个错误,它说这些行有一些问题:

+ QString::number(this->Connections[0].Field1) + " , " + QString::number(this->Connections[0].Field2)
你能告诉我我的问题到底是什么吗? 问候。

2 个答案:

答案 0 :(得分:1)

断言错误表示Connections没有您引用的元素。如果你打印出Connections.size()它表示列表包含多少个元素?

返回string.c_str()可能是一个潜在的内存问题,因为它返回一个指向已释放的内存的指针。

在c ++中,自定义打印通常是通过重载类中的流操作符来完成的:

friend std::ostream &operator<<(std::ostream &os, const myClass &c)
{
  return os << c.some << c.val;
}

...

cout << myObj << endl;

...

strstream ss;
ss << "cool: " << myObj << " " << 55;
string s = ss.str();

你也可以在toStr函数中传递对字符串对象的引用:

makeString(string &s)
{
  ...
  s = qstr.toStdString();
}

string s;
makeString(s);

答案 1 :(得分:0)

是的,代码有很多问题

  • 通常人们不会写“this-&gt; x”;他们只写“x”; “这 - &gt;”是内隐方法
  • 正如另一个答案所指出的那样,c_str()指向无效的内存

但是,Connections列表应至少包含一个元素,因为构造函数会将其附加到那里。我认为如果海报也发布代码来分配结构会有所帮助。看起来构造函数没有被调用或者在实际调用toStr()之前还有其他代码可以清除Connections列表。