从测试程序访问共享库中具有静态私有字段的类



我被c++困住了。我做Java已经超过15年了,但c++只有几周的时间。所以,做c++是受Java影响的,毫无疑问!但是随着c++17也朝着这个方向发展,它可能并不完全错误。这是我的情况:我需要一个名为MyListener的共享库,该类抽象为:

class MyListener {
private:
static int field1;
static struct field2;
public:
~MyListener() {
// do whatever!
}
//constructor
MyListener() {
field1 = 10;
field2.name = “Hello”;
field2.addr=”Dolly”;
}
Vector<char> getMessage() {
Open socket using initialized static fields;
return socket.message;
}
};

我需要一个测试类来使用共享库,比如MyListenerTest.cpp包含以下内容:

int main() {
MyListener * ml = new MyListener();
while(true){
std::vector<char> data = ml->getMessage();
}
delete ml;
}

问题:

  • 类 MyListener 可以编译和共享库,例如 libMyListener.so 已创建。

为了编译测试类,我定义了类似的东西

g++ -std=c++14 -LpathtoMyListener –lMyListener -etc

但是从MyListenerTest中看不到MyListener类.cpp 如何告诉MyListenerTest在哪里查找? 当然,首先我在头文件中声明了该类,并将该文件包含在测试程序中,因此可以看到该类。但是要么我得到定义的两次错误,要么如果我只在标题中声明类,我会收到一个错误,因为私有字段不可见。当然,我也尝试使用setters和getters,因为它在Java中很常见。但这给出了一个可怕的解决方案!

  • 如何使用c++以干净的方式处理这种情况?

最后,共享库应通过JNIJava访问。现在我坚持使用c++进行测试。 致力于 Debian9 和 Eclipse Oxigene。

知道了!答案是不对类字段使用"静态"修饰符。这样做我得到了我想要的。通过构造函数初始化套接字数据的私有字段,以及使用私有字段中的套接字初始化通过套接字读取或写入消息的方法。现在,我们必须确保只有一个类对象的副本。但由于它是一个嵌入式系统,所以这是容易的部分。是的,在 Java 中,我经常使用静态类和静态方法在不创建对象的情况下拥有专用类型。使用 c++ 也可能,我只是不知道。