C++ 实现一个不能被copy的类

实现一个不能被copy的类

1.先实现父类

  1. 一个类不能被copy,首先肯定是构造函数没有。
  2. 其次,拷贝构造不能有
  3. 赋值构造函数也不能有

基于这三点,就容易实现了。下边看看代码。

2.代码实现

先来看看基类,如下:

class UnCopyAble {
public:
	UnCopyAble(const UnCopyAble &) = delete;
	UnCopyAble &operator=(const UnCopyAble &) = delete;
	UnCopyAble &operator=(const UnCopyAble &) const = delete;
protected:
	UnCopyAble() = default;
};

派生类就简单了,

class A : public UnCopyAble {
}

class B : public UnCopyAble {
}

class C : public UnCopyAble {
}

小结

看过代码逻辑及实现流程,有没有觉得挺简单的。还是面向对象的基础,构造函数,拷贝构造函数,赋值操作符这些。抽空看看,时长思考下一些基础知识。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以参考以下代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define DEFAULT_SIZE 128 typedef struct { char *data; size_t length; size_t capacity; } String; String *string_new(void) { String *self = malloc(sizeof(String)); if (!self) { return NULL; } self->capacity = DEFAULT_SIZE; self->data = malloc(self->capacity); if (!self->data) { free(self); return NULL; } self->length = 0; self->data[0] = '\0'; return self; } void string_free(String *self) { if (self) { if (self->data) { free(self->data); } free(self); } } int string_resize(String *self, size_t new_capacity) { if (new_capacity <= self->capacity) { return 0; } char *new_data = realloc(self->data, new_capacity); if (!new_data) { return -1; } self->data = new_data; self->capacity = new_capacity; return 0; } int string_append_c(String *self, char c) { if (self->length + 1 >= self->capacity) { if (string_resize(self, self->capacity * 2)) { return -1; } } self->data[self->length] = c; self->length++; self->data[self->length] = '\0'; return 0; } int string_append_s(String *self, const char *s) { size_t s_length = strlen(s); if (self->length + s_length >= self->capacity) { if (string_resize(self, self->capacity + s_length)) { return -1; } } strcat(self->data, s); self->length += s_length; return 0; } int string_printf(String *self, const char *format, ...) { va_list args; va_start(args, format); int result = vsnprintf(self->data + self->length, self->capacity - self->length, format, args); va_end(args); if (result < 0) { return result; } self->length += result; if ((size_t)result >= self->capacity - self->length) { if (string_resize(self, self->capacity * 2)) { return -1; } va_start(args, format); result = vsnprintf(self->data + self->length, self->capacity - self->length, format, args); va_end(args); } ### 回答2: C语言中没有现成的字符串,但可以通过自定义结构体和相关函数实现一个字符串。 首先,定义一个结构体来表示字符串: ```c typedef struct { char* data; // 字符串内容 int length; // 字符串长度 } String; ``` 然后,实现相关操作函数: 1. 创建字符串: ```c String createString(const char* str) { String newString; newString.length = strlen(str); newString.data = (char*)malloc((newString.length + 1) * sizeof(char)); strcpy(newString.data, str); return newString; } ``` 2. 销毁字符串: ```c void destroyString(String* str) { free(str->data); } ``` 3. 字符串复制: ```c void copyString(String* dest, const String* src) { dest->length = src->length; dest->data = (char*)malloc((src->length + 1) * sizeof(char)); strcpy(dest->data, src->data); } ``` 4. 字符串连接: ```c void concatString(String* dest, const String* src) { int totalLength = dest->length + src->length; dest->data = (char*)realloc(dest->data, (totalLength + 1) * sizeof(char)); strcat(dest->data, src->data); dest->length = totalLength; } ``` 5. 字符串比较: ```c int compareString(const String* str1, const String* str2) { return strcmp(str1->data, str2->data); } ``` 6. 获取字符串长度: ```c int getStringLength(const String* str) { return str->length; } ``` 这样,我们就实现一个简单的C字符串。使用时,可以使用似于以下的方式操作字符串: ```c String str1 = createString("Hello"); String str2 = createString("World"); concatString(&str1, &str2); printf("%s\n", str1.data); destroyString(&str1); destroyString(&str2); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值