因此,我有一个类定义,并且我想添加一个成员变量,该变量可以是 2 个不同类之一,具体取决于运行此代码的操作系统。
无论如何,是否可以在 C++ 中执行此操作,以便我可以在初始化 MyOperatingSystem 时根据某些争论或变量来为“operating_system”成员变量初始化不同的类?
#include <iostream>
#include "Win.h"
#include "Lin.h"
using namespace std;
typedef int os_type;
enum {Win, Lin};
class MyOperatingSystem {
public:
MyOperatingSystem(int ver, string n, os_type os);
private:
int version;
string name;
// operating_system // want this to be either (Windows win | Linux lin)
};
// constructor
MyOperatingSystem::MyOperatingSystem(int ver, string n, os_type os){
version = ver;
name = n;
if (os == Win){
// operating system = Windows(int i);
}
else{
// operating system = Linux(int i)
}
}
Run Code Online (Sandbox Code Playgroud)
Win.h和Lin.h如下
Win.h:
#include <windows.h>
class Windows{
public:
Windows(int i){
integer = i;
mystring = "WinString";
}
private:
int integer;
LPCWSTR mystring;
};
Run Code Online (Sandbox Code Playgroud)
林.h:
#include <termios.h>
class Linux{
public:
Linux(int i){
integer = i;
mystring = "LinString";
}
private:
int integer;
cc_t* mystring;
};
Run Code Online (Sandbox Code Playgroud)
我建议做出编译时决定。
例子:
#pragma once // MyOperatingSystem.h
class IOperatingSystem {
public:
virtual ~IOperatingSystem() = default;
// misc operations:
virtual foo() = 0;
};
#ifdef _WIN32
#include "internal/Win.h" // in here MyOperatingSystem implements IOperatingSystem
#else
#include "internal/Lin.h" // in here MyOperatingSystem implements IOperatingSystem
#endif
Run Code Online (Sandbox Code Playgroud)
您不一定需要virtual
这里,但在设计时它有助于确保两个实现都遵循相同的接口。