所以我有一個類定義,我想添加一個成員變數,它可以是 2 個不同類中的 1 個,具體取決于運行此代碼的作業系統。
無論如何在 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)
}
}
Win.h和Lin.h如下
贏.h:
#include <windows.h>
class Windows{
public:
Windows(int i){
integer = i;
mystring = "WinString";
}
private:
int integer;
LPCWSTR mystring;
};
林.h:
#include <termios.h>
class Linux{
public:
Linux(int i){
integer = i;
mystring = "LinString";
}
private:
int integer;
cc_t* mystring;
};
uj5u.com熱心網友回復:
我建議在編譯時做出決定。
例子:
#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
您不一定需要virtual在這里,但它有助于設計以確保兩個實作都遵循相同的介面。
uj5u.com熱心網友回復:
最明顯的解決方案是擁有一個OperatingSystem具有通用介面的基類,并從中派生出你的Win和Linux。
uj5u.com熱心網友回復:
std::variant<Windows, Linux> operating_system;
std::variant是 sum 型別 - 它是型別串列中的型別之一。
作為一個副作用,它帶有它的型別——所以os_type變數存盤在它旁邊是多余的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/490899.html
