没有类的对象 - 'clean C'中的数据模型

Mik*_*rek 4 c c++ procedural-programming c++11

我在一些中型项目上使用过C++,但我从来没有在C中做过任何严肃的编程.

阅读完本文后,我开始想知道如何在没有类和异常的情况下使用C++ 11.我曾经听过干净的C这个词.Clean C应该是一个C++代码,它不使用ANSI C没有的C++特性,比如类或元编程.

有充足的资源如何有效地使用C语言以及如何在C++中完成它们.但是很难找到任何有关如何充分利用这两个方面的资源.

我的问题分为两部分:

  1. 在没有名称空间,异常和元编程的情况下使用C++是否有任何好的资源?书籍,开源项目?
  2. 请查看这段简单的代码,这是我第一次尝试处理C++ 11中提到的子集中的数据结构和字符串.我首先想到的是代码冗余.你有什么不同的做法,为什么?

-

#include <cstring>

namespace addressbook {
namespace contact {

struct contact {
    char* name;
    char* email;
};

void initialize(addressbook::contact::contact* contact)
{
    contact->name = nullptr;
    contact->email = nullptr;
}

void deinitialize(addressbook::contact::contact* contact)
{
    delete[] contact->name;
    delete[] contact->email;
}

void set_name(addressbook::contact::contact* contact, char* name)
{
    delete[] contact->name;
    contact->name = new char [strlen(name) + 1];
    std::strcpy(contact->name, name);
}

void set_email(addressbook::contact::contact* contact, char* email)
{
    delete[] contact->email;
    contact->email = new char [strlen(email) + 1];
    std::strcpy(contact->email, email);
}

} // namespace contact
} // namespace addressbook

int main()
{
    namespace c = addressbook::contact;

    c::contact jimmy;

    c::initialize(&jimmy);

    c::set_name(&jimmy, const_cast<char*>("Jimmy Page"));
    c::set_email(&jimmy, const_cast<char*>("jp@example.com"));

    c::deinitialize(&jimmy);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请怜悯我 - 我是一个结构编程新手.

为什么不只是C呢?

命名空间,新/删除,标准库算法,增强库,C++ 11很酷的功能 - 仅举几例.

为什么在没有构造函数/析构函数时使用new/delete?

因为类型安全.malloc回报*void

但标准库抛出异常!并且提升也是如此!

我没有使用异常的事实并不意味着我无法处理来自外部库的异常.这只是意味着我要在不同的管理问题,我的部分系统.

Pup*_*ppy 10

但是很难找到任何有关如何充分利用这两个方面的资源.

因为没有一个.做这种事情的唯一原因是因为你非常渴望兼容性 - 例如,Lua是用"干净的C"编写的.根本没有什么"最好的".

这只是C代码假装是可怕的C++代码.它不是C++代码,而是兼容的.关于"干净的C"没有比普通的C更好的了.

编辑:你,先生提问者,似乎不知道WTF"干净的C"甚至.它正在制作你的源代码,甚至是实现,编译为C++的C代码.没有名称空间,没有类型,没有常量,没有任何东西.C++ - with-aC-interface是一个完全不同的东西,与清理C完全无关.在这种情况下,没有理由限制你在实现中使用哪些C++特性.

  • "这只是C代码假装是可怕的C++代码." +1 (4认同)
  • @Mikolaj:干净的C中没有一个存在.提供C接口和使源代码C兼容之间存在差异. (4认同)
  • @DeadMG他们被引用作为使用缩减C++而不是C的原因.我从根本上认为人为地限制C++是错误的,但这仍然是一个非常好的理由. (2认同)

Kon*_*lph 8

首先要注意的是,即使我们接受文章的前提,也没有理由不使用类.也许不使用构造函数,赋值等. - 但是没有理由不使用成员函数.

接下来,不要陷入在整个地方使用指针的陷阱.在可能的情况下,您仍然应该更喜欢值语义.如果你必须使用指针,使用智能指针而不是手动内存管理,并注意甚至new可以抛出异常(除非你使用std::nothrow重载).

最后,不要避免使用C++标准库函数来支持C函数.例如,不要使用strcpy- use std::copy和其他C++算法.


另外,不需要检查nullptr之前的检查delete[].