2011-02-18 6 views
0

다음 프로그램에 문제가 있습니다. 링크 된 목록을 사용하여 스택을 구현합니다. 코드가 좋기 때문에 여기에 모든 코드가 표시되지 않습니다. 그러나 문제는 다음과 같습니다. 내가 프로그램을 실행하는 IDE를 사용하고 서로 다른 파일을 링크로.C++ 링커 오류

나는 TestIntStacks.cpp을 실행하면., 주요 방법은 StackFunctions.cpp에서 test()를 호출 할 예정이다. (StackFunctions.cpp에 정의) 테스트 기능의 TestStack 사용 현재 "링커 오류, push/pop not defined"오류가 발생합니다. 내가 뭘 잘못하고있는 것입니까? 네임 스페이스와 관련이 있습니다.

MyStack.h 
------------------------------------- 
namespace A 
{ 
    class Node{ 
     public : 
      char data; 
      StackNode* link; 
      StackNode(int v=0): data(v), link(NULL){ } 
    }; 

    class MyStack{ 
     private: 
      Node * top; 

     public: 
      MyStack():top(NULL){ } 
      void push(int c); 
    }; 
}//namespace 


//TestStack.cpp 
-------------------------------------------------------------- 
#include "MyStack.h" 

namespace A 
{ 
    void MyStack::push(int x) 
    { 
     StackNode *temp = new StackNode(x); 
     temp->link = top; 
     top = temp; 
    } 
} 

//StackFunctions.cpp 
----------------------------------------------------------- 
#include <iostream> 
#include "TestStack.h" 

using namespace std; 
using namespace A; 

void test() 
{ 
    MyStack st; 
    st.push(1); 
    st.push(2); 
    st.push(3); 
    st.push(4); 
} 

// TestIntStacks.cpp 
---------------------------------------------------------------- 
// Code for testing the TestStack 
// from the A namespace. 

#include <iostream> 
#include <vector> 
using namespace std; 
#include "TestStack" 
#include "StackFunctions.cpp" 

void test(); 
int main() 
{ 
    test(); 
    system("pause"); 
    return 0; 
} 
+0

네임 스페이스가 맞는지 확실하지 않습니다. 프로그램을 작성하는 방법과 StackFunction.cpp에서이 클래스를 사용하는 방법을 보여주는 것은 사람들을 도울 수 있습니다. – MHC

+0

오류가 발생했습니다. 코드가 정상이라고 가정합니다. 그렇지 않습니다. 코드를 잘못 입력했는지 알려줄 수 있도록 코드를 입력하십시오. – wheaties

+0

링커 명령이란 무엇입니까? 링커가 실행하는 것을 보냅니다. –

답변

1

헤더 파일 TestStack.h에 push()pop() 메서드를 정의하고 있지만 TestStack.cpp에서는이 메서드를 구현하지 않았습니다. 푸시 및 팝 조작을 수행하는 코드를 오브젝트에 추가해야합니다.

+0

답장을 보내 주셔서 감사합니다. 내 TestStack.cpp 파일에서 구현 한, 그냥 여기에 내 코드를 표시하지 않았다. 이 프로그램은 .h 및 .cpp 파일로 분리되지 않을 때 한 파일에있을 때 제대로 작동합니다. dev-C++ IDE를 사용하고 있습니다. – user623629

1

이 오류는 나에게 분명합니다. 헤더 파일에 push()pop()을 선언했지만 이러한 메서드가 구현되는 위치를 링커에서 찾을 수 없습니다.

어디에 정의되어 있습니까?

+0

이들은 TestStack.cpp 파일에 int로 정의됩니다. 숙제 문제이므로 메소드 내부에 코드가 표시되지 않습니다. 프로그램은 하나의 파일에있을 때 제대로 작동하지만 .h와 .cpps로 구분하면 오류가 발생합니다. 고마워요. – user623629

+0

링커가 길을 찾지 못했습니다. 정의되지 않았거나 올바르게 정의되지 않았거나 정의 된 파일이 올바르게 링크되지 않습니다. 어떤 정보를 제공했는지 파악할 수 없습니다. (BTW, 당신이 오류에서 언급 한 방법의 구현을 보여주지 않고이 오류를 게시하는 것이 흥미 롭습니다.) –

+0

좋습니다. 내 예를 업데이트했습니다. – user623629

0

강제로 빌드 스크립트가 두 cpp 파일을 사용해야합니다. 자신 만의 make 파일을 작성했다면 각 소스에 대한 중간 개체를 작성한 다음 끝에 링크해야합니다.

DEV-C++가 자동으로 객체 파일을 생성하거나 모든 것을 연결하려고합니다.

+0

괜찮아요 내 예제를 업데이트했습니다 – user623629

+0

바보 같은 질문 : 프로젝트를 만들었습니까?그렇다면 어떤 파일을 오브젝트 파일로 컴파일할지 선택할 수있는 프로젝트 설정이 있어야합니다. –

1

저는 링커에 제공된 인수와 관련이 있다고 생각합니다. 예를 들어, Visual C++ 6 다음과 같은 방법으로 사용할 때 비슷한 오류가 발생합니다. 클래스에 대한 .cpp 및 .h 파일을 만들었다 고 가정 해 봅시다. 프로젝트에 cpp 파일을 포함시키지 않으면 비슷한 오류가 발생합니다. IDE가 제공된 헤더 파일을 기반으로 소스 파일을 결정하지 않기 때문입니다. dev-C++ IDE에 대해서는 잘 모르겠지만 그 해결책은 비슷할 수 있습니다. 문제는 TestStack.cpp를 컴파일 (또는 컴파일하지 않음)하는 것이며이 컴파일 결과가 링커에 제공되지 않아 링커가 구현을 찾을 수 없기 때문입니다.

+0

TestIntStacks.cpp 파일에 .cpp 파일을 포함 시키면 프로그램이 작동하기 때문에 올바른 것일 수 있습니다. – user623629