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

时间:2012-05-10 15:19:19

标签: c++ c c++11 procedural-programming

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

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

有很多资源如何有效地在C中做事,以及如何在C ++中做到这一点。但是,很难找到任何有关如何充分利用这两个方面的资源。

我的问题分为两部分:

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

    #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;
    }
    

    请怜悯我 - 我是结构编程新手。

    为什么不只是C呢?

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

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

    因为类型安全。 malloc返回*void

    但标准库会抛出异常!而且也会提升!

    我没有使用异常的事实并不意味着我无法处理来自外部库的异常。这只是意味着我想在系统的我的部分中以不同方式管理问题。

2 个答案:

答案 0 :(得分:11)

  

但是很难找到任何关于如何获取资源的资源   两全其美。

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

这只是C代码假装是可怕的C ++代码。它不是C ++代码,而是兼容的。 “普通C”没有什么比“普通C”更好的了。

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

答案 1 :(得分:8)

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

接下来,不要陷入在整个地方使用指针的陷阱。您应该仍然更喜欢值语义。如果必须使用指针,请使用 smart 指针而不是手动内存管理,并注意即使new也会抛出异常(除非您使用std::nothrow重载)。< / p>

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


另外,在nullptr之前检查delete[]是不必要的。