2011-12-21 167 views
1

我有一個C++「接口」類,並收到以下錯誤在編譯的時候:靜態方法

Undefined symbols for architecture x86_64: 
     "Serializable::writeString(std::ostream&, std::string)", referenced from: 
      Person::writeObject(std::ostream&) in Person.o 
      Artist::writeObject(std::ostream&) in Artist.o 
     "Serializable::readString(std::istream&)", referenced from: 
      Person::readObject(std::istream&) in Person.o 
      Artist::readObject(std::istream&) in Artist.o 
     ld: symbol(s) not found for architecture x86_64 

clang: error: linker command failed with exit code 1 (use -v to see invocation) 

是否有可能實現在抽象類的靜態方法?

我的實現看起來像這樣。

.h文件中

#ifndef Ex04_Serializable_h 
#define Ex04_Serializable_h 

using namespace std; 

class Serializable { 

public: 
    virtual void writeObject(ostream &out) = 0; 
    virtual void readObject(istream &in) = 0; 

    static void writeString(ostream &out, string str); 
    static string readString(istream &in); 
}; 

#endif 

.cpp文件

#include <iostream> 
#include "Serializable.h" 

using namespace std; 

static void writeString(ostream &out, string str) { 

    int length = str.length(); 

    // write string length first 
    out.write((char*) &length, sizeof(int)); 

    // write string itself 
    out.write((char*) str.c_str(), length); 
} 

static string readString(istream &in) { 

    int length; 
    string s; 

    // read string length first 
    in.read((char*) &length, sizeof(int)); 
    s.resize(length); 

    // read string itself 
    in.read((char*) s.c_str(), length); 
    return s; 
} 

回答

7

嘗試:

void Serializable::writeString (...) { 
// ... 
} 

(嘗試沒有靜態,並添加類名)

+0

嗯,我已經試過了......由於抽象類不能直接初始化,所以我真的需要一個靜態類函數。 – alex 2011-12-21 19:18:23

+1

它將是靜態的 - 在.h文件中保留靜態但從.cpp文件中移除靜態(靜態在兩個位置都有不同的內涵,並且將它放在.h文件中就足夠了,它在.cpp文件中) – necromancer 2011-12-21 19:21:25

+0

你如何認爲你真的需要一個靜態函數?你有沒有得到某種錯誤?或者只是你的直覺?因爲C++中的「靜態」意味着「鏈接不可見」。它不像C#和Java那樣意味着「非實例」。所以,你說這個函數是不可鏈接的,當然以後鏈接器找不到它。 – 2011-12-21 19:24:13