2013-10-09 2 views
0

Я только что пришел из мира Java и Python в мир C++ и столкнулся с проблемой при попытке получить значение от общедоступной функции класса const.Не удается получить значение из класса на C++?

У меня есть класс следующим образом:

class CMDPoint 
{ 
public: 
    CMDPoint(); 
    CMDPoint(int nDimensions); 
    virtual ~CMDPoint(); 
private: 
    int m_nDimensions;  // the number of dimensions of a point 
    float* m_coordinate; // the coordinate of a point 
public: 
    const int GetNDimensions() const { return m_nDimensions; } 
    const float GetCoordinate(int nth) const { return m_coordinate[nth]; } 
    void SetCoordinate(int nth, float value) { m_coordinate[nth] = value; } 
}; 

В конечном счете, я хотел бы написать все в clusterPoint с в clusterPointArray в файл. Тем не менее, сейчас Я просто тестирую его с clusterPoint (таким образом, GetCoordinate(0)).

ofstream outFile; 
outFile.open("C:\\data\\test.txt", std::ofstream::out | std::ofstream::app); 
for (std::vector<CMDPoint> ::iterator it = clusterEntry->clusterPointArray.begin(); it != clusterEntry->clusterPointArray.end(); ++it) 
{ 
    outFile << ("%f", (*it).GetCoordinate(0)); // fails 
    outFile << " "; 
} 
outFile << "\n"; 
outFile.close(); 

Проблема в том, что я вижу только файл " ". Никакой координаты не было написано. Я сделал что-то неправильно, получая значение от const float GetCoordinate(int nth)?

+3

Просто используйте 'outFile << it-> GetCoordinate (0);'. Я также предлагаю добавить проверку границ в «CMDPoint :: GetCoordinate», используя «std :: vector» вместо массива, а затем использовать 'm_coordinate.at (nth)'. В противном случае вы, вероятно, столкнетесь с segfaults, если вы новичок в C++. –

+0

@MarcClaesen Нет, все тот же. :/ –

+0

Вы обеспечили правильность установки индекса координат? i.e 'm_coordinate [0]' фактически имеет значение. Вы не проверяете ошибки. – Chemistpp

ответ

2

пытается изменить

outFile << ("%f", (*it).GetCoordinate(0)); // fails 

к этому:

outFile << (*it).GetCoordinate(0); // OK 

Поскольку ("%f", (*it).GetCoordinate(0)) ничего не представляет, только перечисления выражений, разделенных ,. Я не думаю, что он не будет оцениваться в пару объектов, как в java.

Редактировать: ("%f", (*it).GetCoordinate(0)) фактически оценивает последний элемент (*it).GetCoordinate(0) (комментарий PlasmaHH), поэтому он все равно должен что-то печатать. Однако, если ничего не печатается, коллекция clusterEntry->clusterPointArray может быть пустым и код внутри цикла for может не выполняться никогда.

Надеюсь, что это поможет, Разван.

+1

Это будет фактически evalaute до последнего, так же как 'std :: cout << (1,2,3)' будет печатать '3' – PlasmaHH

+0

Извините, но все еще не удается ... –

+0

PlasmaHH 4 вы были правы, Мне было интересно, как это компиляция, я никогда не использовал это. – Raxvan

0
outFile << it->GetCoordinate(0); 
+0

Я пробовал это, но все еще не удалось. –

+0

@ perfectionm1ng Тогда ваш m_coordinate не указывает на действительный массив. –

Смежные вопросы