Беда с нерешенными внешними проблемами LNK 2019 - PullRequest
0 голосов
/ 04 апреля 2011

Хорошо, как уже упоминалось, у меня есть две нерешенные внешние ошибки. Там нет ошибок IntelliSense и тому подобное, только это две ошибки компоновщика. Вот код.

include "stdafx.h"  
include < iostream >  
using namespace std;

class circle; //forward declaration

class square  
{  
public:
    square create_square(circle user_circle);
};

class circle  
{  
public:
   friend square square::create_square(circle user_circle)
};

square square::create_square(circle user_circle)  
{     
   square user_square(user_circle.get_circumference());  
   return user_square;  
}  

// function call  
user_square = user_square.create_square(user_circle);

Это не вся программа, но, похоже, ошибка указывает на этот пакет кода

Ошибка 1, ошибка LNK2019: неразрешенный внешний символ
"public: __thiscall circle :: ~ circle (void)" (?? 1circle @@ QAE @ XZ), на который ссылается функция
"public: class class __thiscall square :: create_square (class circle)"
(? Create_square @ квадрат @@ QAE? AV1 @ Vcircle @@@ Z) * ​​1009 * C: \ Users \ John \ Documents \ visual studio 2010 \ Проекты \ PROG5 \ PROG5 \ PROG5.obj

Ошибка 2, ошибка LNK2019: неразрешенный внешний символ
"public: __thiscall square :: ~ square (void)" (?? 1square @@ QAE @ XZ), на который ссылается функция
"public: class class __thiscall square :: create_square (class circle)"
(? Create_square @ квадрат @@ QAE? AV1 @ Vcircle @@@ Z) * ​​1015 * C: \ Users \ John \ Documents \ visual studio 2010 \ Проекты \ PROG5 \ PROG5 \ PROG5.obj

Я действительно в замешательстве, и я не хочу просто случайно менять код, потому что моя логика должна быть правильной. Объект круга передается в функцию create_square, функция получает диаметр круга и задает его как периметр квадрата. Что касается бессмысленного упражнения, это для класса. Надеюсь, кто-то может помочь, спасибо.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2011
square square::create_square(circle user_circle)  
{     
   square user_square(user_circle.get_circumference());  
   return user_square;  
} // Destruction point of user_circle

// function call  
user_square = user_square.create_square(user_circle);

Проблема в том, что user_circle передается значением square::create_square. Таким образом, переданный параметр копируется в принимающий аргумент. Что касается возврата функции, объект должен быть уничтожен, но поскольку в объявлении класса вы предоставили только объявление деструктора, но не определение, на которое жалуется компоновщик.

0 голосов
/ 04 апреля 2011

Вы объявили деструктор circle и деструктор square - но не реализовали их.

Кроме того, вы должны отдавать предпочтение ссылкам const, а не на передачу по значению:

square create_square(circle const & user_circle);

Вы получаете ошибку в этот момент, потому что вы передаете circle по значению - что означает, что временное будет создано и уничтожено - и потому что вы возвращаете square по значению, что означает, что square будетбыть построенным и разрушенным.

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