小编Dav*_*ran的帖子

"C++编程语言第4版"第19.3.3.1节中的代码是否有效?

第19.3节呈现了一章,其主要重点是运算符重载的字符串表示,特别是特种作业[],->().它实现了copy_from()如下的辅助功能:

void String::copy_from(const String &x)
    // make *this a copy of x
{
    if (x.sz <= short_max)
    {
        memcpy(this, &x, sizeof(x);
        ptr = ch;
    }
    else
    {
        ptr = expand(x.ptr, x.sz+1);
        sz = x.sz;
        space = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

类接口如下所示:

#ifndef STRING_EXERCISE_H
#define STRING_EXERCISE_H

namespace simple_string
{
    class String;
    char *expand(const char *ptr, int n);
}

class String
{
    public:
        String(); // default constructor x{""}
        explicit String(const char *p); // constructor from …
Run Code Online (Sandbox Code Playgroud)

c++

6
推荐指数
1
解决办法
264
查看次数

在函数中隐藏内存分配是不好的做法吗?

我是否应该期望用户提供足够大小的内存块,比如将文件复制到缓冲区?或者我应该自己分配内存,并希望用户在完成后释放它?例如,函数strdup()本身分配内存,但该函数fread()只需要一个足够大小的缓冲区.

c malloc

5
推荐指数
1
解决办法
140
查看次数

无法手动调用std :: string的析构函数

我正在尝试使用工会,并使用匿名工会成员将此示例类设为A。由于联合包含一个std::string和一个,因此std::vector我需要为该类定义一个析构函数。但是,当我尝试手动调用~string()我得到

union.cpp: In destructor 'A::~A()':
union.cpp:14:14: error: expected class-name before '(' token
    s_.~string();
Run Code Online (Sandbox Code Playgroud)

我不知道这个向量。如果我删除s._~string();对它的调用,则编译正常。这是编译器错误吗?我正在使用MinGW64。

#include <string>
#include <vector>

class A
{
    public:
    explicit A(const std::string &s) : s_ {s}, is_string {true} {}
    explicit A(const std::vector<int> &v) : v_ {v}, is_string {false} {}

    ~A()
    {
        if (is_string)
            s_.~string();
        else
            v_.~vector();
    }

    private:
    union
    {
        std::string s_;
        std::vector<int> v_;
    };
    bool is_string;

};

int main()
{
    A a("Hello, World!");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用std::delete_at(std::addressof(s_)) …

c++

4
推荐指数
1
解决办法
140
查看次数

无法使用三元运算符有条件地分配`istream&`?

我有一个接受a std::istream &并在分配一个成员(a std::istream &)之前检查它的构造函数。例如:

class Stream
{
    public:
    Stream(std::istream &is) : s_ {is.good() ? is : throw std::runtime_error {"Invalid input stream\n"}} 
        {}

    private:
    std::istream &s_;
};
Run Code Online (Sandbox Code Playgroud)

编译器抱怨的构造函数std::basic_istream(const basic_istream &)被删除(可以理解,因为您不能复制流)。但是,我看不到在这里进行任何复制吗?它必须在三元运算符中,因为

Stream(std::istream &is) : s {is} {}
Run Code Online (Sandbox Code Playgroud)

没有检查就可以了。std::istream尝试复制到哪里?我该如何解决呢?

c++ ternary-operator

4
推荐指数
1
解决办法
100
查看次数

获取别名std :: array的大小?

考虑例如:

#include <array>
#include <iostream>

int main()
{
    using Ram_bank = std::array<char, 0x2000>;
    std::cout << "Size of ram bank is: " << Ram_bank::size() << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

显然,这不是有效的代码,Ram_bank不是实际的类型或对象,而是别名。但是,有什么方法可以实现这一目标吗?有没有一种方法来获取别名类型的大小?

c++

1
推荐指数
1
解决办法
48
查看次数

C++类构造函数语法的解释?

阅读C++编程语言第4版,有一个类似的定义

class Vector
{
    private:
        int sz;
        double *a;
    public:
        Vector(int s) :elem{new double[s]}, sz{s} {}
}
Run Code Online (Sandbox Code Playgroud)

我对这个构造函数语法的工作原理有点困惑.我相信Vector(int s)正在创建一个构造函数,它接受一个参数s,并初始化elemsz.但为什么会有:?我以为功能体被包围了{}?那么最后的空括号{}是什么?

c++

0
推荐指数
1
解决办法
93
查看次数

标签 统计

c++ ×5

c ×1

malloc ×1

ternary-operator ×1