标题:求助自定义变长字符串类型的实现。(运算符重载)
只看楼主
nifilmjon
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2021-8-5
结帖率:100%
已结贴  问题点数:20 回复次数:4 
求助自定义变长字符串类型的实现。(运算符重载)
1、实现一种自己喜欢但C++不支持的数据类型——变长字符串类型。所谓变长字符串,即根据需要的大小分配字符动态数组空间。重载该类型的常用运算符,比如字符串赋值(=)、比较(>或<)、连接(+)、插入(<<)、提取(>>)等。注意内存的分配与回收,注意构造函数、复制构造函数和析构函数的使用。
2、使用自己定义的变长字符串类型,实现一个有意义的程序。
3、自学读写文件操作完成自动存盘等。

因为我还没学到这个课题,所以现在一筹莫展没有任何思路,请各位大大提供一些思路。能让我学习。
搜索更多相关主题的帖子: 自定义 字符串 类型 构造函数 运算符重载 
2021-08-05 07:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
听不懂呀,你是不是想要实现一个自己的 std::string?
“插入(<<)、提取(>>)”又是什么意思?
2021-08-05 08:45
nifilmjon
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2021-8-5
得分:0 
回复 2楼 rjsp
对的 就是要实现自己的std::string,但我还没有学到这里,我一点思路都没有版主大大。
2021-08-05 09:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
回复 3楼 nifilmjon
我写了半个小时,才把 构造 和 赋值 写完,我没时间做这事了,
你自己写吧,不会的地方对照着 std::string 看

程序代码:
#include <cstddef>

class foo
{
public:
    constexpr foo() noexcept;
    constexpr foo( const char* s );
    constexpr foo( const foo& other );
    constexpr foo( foo&& other ) noexcept;
    constexpr foo( std::nullptr_t ) = delete;
    ~foo();

    constexpr foo& operator=( const char* s );
    constexpr foo& operator=( const foo& other );
    constexpr foo& operator=( foo&& other ) noexcept;
    constexpr foo& operator=( std::nullptr_t ) = delete;

    constexpr foo& assign( const char* s );
    constexpr foo& assign( const char* s, size_t count );
    constexpr void clear() noexcept;
    
protected:
    char* p_;
    size_t size_;
};

#include <iostream>
#include <cstring>
using namespace std;

constexpr foo::foo() noexcept : p_(), size_()
{
}
constexpr foo::foo( const char* s ) : foo()
{
    assign( s );
}
constexpr foo::foo( const foo& other ) : foo()
{
    assign( other.p_, other.size_ );
}
constexpr foo::foo( foo&& other ) noexcept : p_(other.p_), size_(other.size_)
{
    other.p_ = nullptr;
    other.size_ = 0;
}
foo::~foo()
{
    delete[] p_;
}

constexpr foo& foo::operator=( const char* s )
{
    assign( s );
    return *this;
}
constexpr foo& foo::operator=( const foo& other )
{
    if( this != &other )
        assign( other.p_, other.size_ );
    return *this;
}
constexpr foo& foo::operator=( foo&& other ) noexcept
{
    p_ = other.p_;
    size_ = other.size_;
    other.p_ = nullptr;
    other.size_ = 0;
    return *this;
}

constexpr foo& foo::assign( const char* s )
{
    clear();
    return assign( s, s?strlen(s):0 );
}
constexpr foo& foo::assign( const char* s, size_t count )
{
    clear();
    if( s && count )
    {
        size_ = count;
        p_ = new char[size_+1];
        memcpy( p_, s, size_ );
        p_[size_] = '\0';
    }
    return *this;
}
constexpr void foo::clear() noexcept
{
    if( p_ )
    {
        size_ = 0;
        delete[] p_;
        p_ = nullptr;
    }
}
2021-08-05 12:59
nifilmjon
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2021-8-5
得分:0 
回复 4楼 rjsp
非常感谢版主大大的相助,我自己琢磨琢磨您写的代码。谢谢您
2021-08-05 13:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506409-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.170042 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved