在C++中实现Set of octets类

Implementing Set of octets class in C++

本文关键字:of octets Set 实现 C++      更新时间:2023-10-16

我有一个OOP任务,上面写着:

您被要求实现一个C++类来建模一组八位字节(无符号的8位数字,通常称为字节)。该类将在嵌入式应用程序中使用,该应用程序不能假设存在STL,并且还必须使用尽可能少的存储量(对于完整集的最坏情况),同时在执行过程中尽可能高效。您的类应该具有适当的构造函数和析构函数;除了实现允许类用户向集合添加数字和从集合中删除数字以及检查数字是否属于集合的方法之外。再一次,您的set类应该是自包含的,不应该使用C++STL库,而是应该基于内置的C++类型。您还被要求实现一个主程序,该程序使用您的类来演示以上内容接口。

这是我的set.h文件:

// File: Set.h
#ifndef SET_H
#define SET_H
// Specification of the class
class Set
{
private:
int memory[8];
public:
Set(); // Constructor 
~Set(); // Destructor 
void add(int i); // Add number to a set
bool find(int i); // Checks if a number belongs to a set
void remove(int i);// Remove number from a set
};

#endif

和我的set.cpp文件

// File: Set.cpp

#include <iostream>
#include "Set.h"
Set::Set(){ // Constructor 
for (int x = 0; x <8; x++)
memory[x] = 0;
};
void Set::add(int i) // Add integer i to a set
{
if (find(i)){
int index = i / 32;
int bit = i % 32;
memory[index] +=  1<< bit ;
}
}
bool Set::find(int i) // Checks if integer i belongs to a set. Returns true if yes
{
int index = i / 32;
int bit = i % 32;
int temp = (memory[index] >> bit)%2;
return temp;
}
void Set::remove(int i) // Remove integer i from a set
{
if (find(i)){
int index = i / 32;
int bit = i % 32;
memory[index] -= 1 << bit;
}
}

我尝试实现一个简单的主文件来测试类,如下所示:

// File: Setmain.cpp
// Test file for the Set class
#include <iostream>
#include "Set.cpp"
using namespace std;
int main(){
Set test;
test.add(200);
return 0;
}

我得到了这些错误,我不知道如何解决它们,任何帮助都将不胜感激

error LNK2005: "public: __thiscall Set::Set(void)" (??0Set@@QAE@XZ) already defined in Set.obj  
error LNK2005: "public: void __thiscall Set::add(int)" (?add@Set@@QAEXH@Z) already defined in Set.obj
error LNK2005: "public: bool __thiscall Set::find(int)" (?find@Set@@QAE_NH@Z) already defined in Set.obj
error LNK2005: "public: void __thiscall Set::remove(int)" (?remove@Set@@QAEXH@Z) already defined in Set.obj
error LNK2019: unresolved external symbol "public: __thiscall Set::~Set(void)" (??1Set@@QAE@XZ) referenced in function _main    
error LNK1120: 1 unresolved externals   

提前感谢

将主菜单更改为

#include "Set.h"
  1. 在setmain.cpp中,更改

    #include "Set.cpp"
    

    #include "Set.h"
    
  2. 在set.cpp中,实现一个析构函数

    Set::~Set()
    {
    }
    

当我复制您的代码时,我只得到一个错误,类似于上面列表中的最后一个错误(我在Linux/Fedora下运行g++)。一旦我定义了Destructor函数Set::~Set(void)(作为一个空函数),编译就成功了。

Set::~Set(void) { // Destructor 
};

除此之外,就最佳编程实践而言,我建议进行一些范围检查,就代码效率而言,我推荐使用移位运算符(I>>5)而不是除法(I/32),并使用掩码运算(I&0x1F)而不是模(I%32)。人们会希望一个好的优化编译器能够以任何一种方式生成相同的代码,但为什么会这样呢?