2015-10-19 3 views
0

Я все еще новичок в C++, и я должен найти ошибки в следующем коде.Какие ошибки имеют следующие коды?

1 class Thing 
2 { 
3 public: 
4  char c; 
5  int *p; 
6  float& f; 
7  Thing(char ch, float x) { c = ch; p = &x; f = x; } 
9 }; 

Я понимаю, что в шестой строке есть ошибка: ссылка f должна быть инициализирована. Но я запутался в седьмой строке. Он выглядит как конструктор, но я не могу убедиться, что p = & x; верно? Кроме того, если я хочу исправить ошибку инициализации ссылки, как я могу это сделать?

+0

Ты в значительной степени там. Теперь вам просто нужно продолжать думать и исследовать, чтобы узнать, как инициализировать ссылку, и все готово. –

ответ

3

Лучшее, что нужно сделать, чтобы выяснить, есть ли ошибки, просто скомпилировать его (1).

Если вы сделаете это, вы увидите, по крайней мере, две проблемы:

  • ссылки должны быть инициализированы; и
  • вы не можете назначить указатель float и int-pointer.

(1) Согласно этой стенограммы:

$ g++ -c -o prog.o prog.cpp 
prog.cpp: In constructor ‘Thing::Thing(char, float)’: 
prog.cpp:7:7: error: uninitialized reference member in ‘float&’ [-fpermissive] 
     Thing(char ch, float x) { c = ch; p = &x; f = x; } 
    ^
prog.cpp:6:14: note: ‘float& Thing::f’ should be initialized 
     float& f; 
      ^
prog.cpp:7:43: error: cannot convert ‘float*’ to ‘int*’ in assignment 
     Thing(char ch, float x) { c = ch; p = &x; f = x; } 
             ^
+0

Поскольку x здесь: Thing (char ch, float x) передается по значению, я все еще могу получить доступ к адресу x? – alsjinus

+0

@Aria, нет, и это станет ясным, когда вы очищаете каждую проблему и пытаетесь перекомпилировать :-) Объект 'x', как формальный, а не фактический параметр, исчезнет после возвращения функции, поэтому установка ссылки на он, который сам выдержит функцию выхода, - это нет-нет. – paxdiablo

0
p = &x; 

не верно, так как p имеет тип int* и &x имеет тип float* есть.

f = x; 

скорее всего не то, что вы намеревались. Вероятно, вы хотите, чтобы f был ссылкой на x. Вышеупомянутая строка этого не делает. Он присваивает значение x объекту, на который ссылается f.

Если вы хотите f быть ссылкой на x, вы должны инициализировать его как:

Thing(char ch, float& x) : f(x) { ... } 
       // ^^^ different from your signature 

Использования

Thing(char ch, float x) : f(x) { ... } 

является проблематичным, поскольку f будет оборванной ссылкой раз функции возвращает ,

+0

Могу ли я просто изменить эту строку: Thing (char ch, float x) {c = ch; p = & x; f = x; } in to Thing (char ch, float x) {c = ch; &f = x;}, а также удалить шестую строку? – alsjinus

+0

Нет, вы не можете. Ваш вопрос убеждает меня в том, что вы не понимаете, как работают ссылочные типы на C++. Попробуйте http://stackoverflow.com/questions/2765999/what-is-a-reference-variable-in-c. –

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