2011-07-10 29 views
0

可能性の重複:
What is an undefined reference/unresolved external symbol error and how do I fix it?未解決の外部シンボル

私はC++の比較的新しいです(おそらく、質問によって言うことができるように)、私はこの問題をヒットしました。 Drives.hとDrives.cpp

Drives.h

#pragma once 

enum MountMode 
{ 
    User, 
    System, 
    Both, 
    Auto 
}; 

class Drive 
{ 
public: 
    Drive(void); 
    ~Drive(void); 

    BOOL Mount(MountMode mode); 
    VOID Unmount(void); 
    BOOL IsConnected(void); 

    static char* DeviceName; 
    static char* DrivePath; 
}; 

class Drives 
{ 
public: 
    Drives(void); 
    ~Drives(void); 
}; 

と私のDrives.cpp::私は2つのファイルを持ってエラーが言っている

#include "stdafx.h" 
#include "Drives.h" 

Drives::Drives(void) 
{ 
    Drive USB0; //Error happening here 
} 

Drives::~Drives(void) 
{ 
} 

そのドライブクラスのコンストラクタ、デストラクタとIsConnected()はすべて未解決の外部です。私はあなたがDriveのコンストラクタとデストラクタを実装していない、エラーメッセージが言うように、私はcplusplus.comに1のように、事前

答えて

4

おかげで、このクラスを設定するので、私が欠けているかわからないんだけど:

Drive::Drive(void) { 
    ... 
} 

Drive::~Drive(void) { 
    ... 
} 

(あなたがDrive USB0;にそうであるように)クラス型のローカル変数を作成するには、そのクラスのコンストラクタを呼び出します、とデストラクタは、変数のスコープの終わりに呼び出されます。したがってエラーです。

他の関数Driveも実装する必要があります。クラス宣言で関数を宣言することは、本質的には関数がどこかで実装されるという約束です。

3

はい、これらのメソッドはヘッダーファイルのDriveクラスで宣言されていますが、実際にはこれらのメソッドのボディを作成していません。

ヘッダーファイルにインラインボディを作成するか、CPPファイルでボディを作成するか、またはこれらのメソッドを定義する既存のファイルとリンクしていることを確認する必要があります。さもなければ、エラーは正しい、これらのメソッドは定義されていません。

2

未解決の外部シンボルエラー通常はは、関数の宣言を提供していますが、その定義は提供していないことを意味します。

Drive(void)~Drive(void)を宣言しているため、コンパイラはデフォルトを削除し、定義が存在しないことを期待しているため、エラーが発生します。

注:空の括弧の代わりにvoidを使用すると、「この関数は引数をとりません」という意味はCスタイル定義であり、使用しないでください。

#pragma onceをインクルードガードの代わりに使用してください。これはMicrosoft固有の構造であり、他のコンパイラと互換性がありません。あなたは二つのクラス(DriveDrives)を宣言しますが、あなただけのための1つ(Drives

#pragma once 

enum MountMode 
{ 
    User, 
    System, 
    Both, 
    Auto 
}; 

class Drive 
{ 
public: 
    Drive(void); 
    ~Drive(void); 

    BOOL Mount(MountMode mode); 
    VOID Unmount(void); 
    BOOL IsConnected(void); 

    static char* DeviceName; 
    static char* DrivePath; 
}; 

class Drives 
{ 
public: 
    Drives(void); 
    ~Drives(void); 
}; 

を取り除くために実装を提供し、次のコードで


#ifndef CLASS_NAME_H 
#define CLASS_NAME_H 
//CODE HERE 
#endif 
+1

他のコンパイラと互換性がありませんか?それは実際に私を笑ってしまった。 – Lockhead

+0

@Casey:#pragma onceはclang、GCC、Intel、Borlandなどでうまく動作します。「Microsoft特有」と呼ぶのは間違いです。 – ildjarn

+1

@ildjarn:それはまだ非標準です。 – George

1

:実際には、代わりに警備員を含ん使用ドライブのクラスメソッドの実装を含める必要があります。あなたのコードは、このようなルックスを働くことができるように、あなたのDrives.cppを拡張する方法では:あなたはコードを貼り付け-Dコピーする場合

#include "stdafx.h" 
#include "Drives.h" 

//Drive class constructor 
Drive::Drive(void) 
{ 
    //Add initialization code here. For example: 
    DeviceName = "Name"; 
    DrivePath = ""; 
} 

//Drive class destructor 
Drive::~Drive(void) 
{ 
} 

//Also add the implementation for Mount 
BOOL Drive::Mount(MountMode mode) 
{ 
    //implementation for Mount. For example: 
    return FALSE; 
} 

//Also add the implementation for Mount 
VOID Drive::Unmount() 
{ 
    //implementation for Unmount 
} 

//Also add the implementation for Mount 
BOOL Drive::IsConnected() 
{ 
    //implementation for IsConnected.For example: 
    return FALSE; 
} 


//Drives class constructor 
Drives::Drives(void) 
{ 
    Drive USB0; //Error happening here 
} 

//Drives class destructor 
Drives::~Drives(void) 
{ 
} 

それはあなたにもDriveクラスの実装を持っていますということも可能ですDrive.cppのように別の.cppファイルに保存します。その場合は、他のDrive.cppファイルからすべての実装方法をDrives.cppにコピーする必要があります。または、Driveクラスの宣言をDrives.hからDrive.hに移動する必要があります。その場合、さまざまなファイルのクラスを明確に分離することになりますが、これはをDrives.hファイルに含める必要があります。

関連する問題