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;
}
嗯,我已經試過了......由於抽象類不能直接初始化,所以我真的需要一個靜態類函數。 – alex 2011-12-21 19:18:23
它將是靜態的 - 在.h文件中保留靜態但從.cpp文件中移除靜態(靜態在兩個位置都有不同的內涵,並且將它放在.h文件中就足夠了,它在.cpp文件中) – necromancer 2011-12-21 19:21:25
你如何認爲你真的需要一個靜態函數?你有沒有得到某種錯誤?或者只是你的直覺?因爲C++中的「靜態」意味着「鏈接不可見」。它不像C#和Java那樣意味着「非實例」。所以,你說這個函數是不可鏈接的,當然以後鏈接器找不到它。 – 2011-12-21 19:24:13