невозможно построить сложную структуру в C ++ - PullRequest
0 голосов
/ 07 января 2010

У меня есть две базовые структуры, такие как:

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 ]

1 голос
/ 07 января 2010

ошибка подтверждения говорит о том, что в 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);
0 голосов
/ 08 января 2010

Да, у кода много проблем

  • Обычно люди не пишут "this-> x"; они просто пишут «х»; "this->" неявно внутри методов
  • Как указано в другом ответе, c_str () указывает на недопустимую память здесь

Однако в списке соединений должен быть хотя бы один элемент, потому что конструктор добавляет его туда. Я думаю, что было бы полезно, если бы автор также разместил код для размещения структуры. Похоже, конструктор не вызывается ИЛИ есть другой код, который очищает список соединений до того, как toStr () будет вызван.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...