Pertanyaan Kelas dibangun hanya di atas tumpukan; tidak dengan yang baru. C ++


Apakah ada cara untuk membuat kelas Foo

sehingga bisa saya lakukan:

Foo foo;

tapi tidak

Foo* foo = new Foo(); 

?

Saya tidak ingin orang-orang dapat mengalokasikan salinan Foo di heap.

Terima kasih!

EDIT: Maaf, saya salah pada "tumpukan saja, bukan tumpukan". Yang ingin saya katakan adalah "tidak bisa menggunakan operator baru".


4
2018-02-20 10:28


asal


Jawaban:


Jadikan milik Anda operator new pribadi.

#include <new>

struct Foo {
        int x;
private:
        void* operator new (std::size_t size) throw (std::bad_alloc);
};

Pada C ++ 0x Anda bisa delete itu operator new:

struct Foo {
        int x;
        void* operator new (std::size_t size) throw (std::bad_alloc) = delete;
};

Perhatikan bahwa Anda perlu melakukan hal yang sama untuk operator new[] terpisah.


5
2018-02-20 10:36



Mustahil untuk mencegah sebuah objek yang dibuat di heap. Selalu ada jalan di sekitarnya. Bahkan jika Anda berhasil bersembunyi operator new untuk Foo, Anda selalu dapat melakukan:

#include <new>

struct Foo {
        int x;
private:
        void* operator new (std::size_t size) throw (std::bad_alloc);
};

struct Bar
{
    Foo foo;
};

int main()
{
    Bar* bar = new Bar;
    return 0;
}

Dan hei presto, Anda memiliki Foo di heap.


14
2018-02-20 11:01



Dalam dokumentasi Anda, letakkan "jangan buat di heap". Menjelaskan mengapa itu ide yang bagus. Perhatikan bahwa setiap upaya untuk menegakkan konstruksi stack-only juga akan mencegah kelas digunakan dalam kontainer standar dan kelas serupa - itu bukan ide yang baik.


5
2018-02-20 10:32



Anda dapat memberi kelas operator baru pribadi. Lihat Operator publik baru, operator swasta menghapus: mendapatkan C2248 "tidak dapat mengakses anggota pribadi" ketika menggunakan yang baru untuk informasi lebih lanjut.


3
2018-02-20 10:36



Mengapa Anda tidak ingin orang-orang membuat Foo di heap? Saya tidak bisa memikirkan alasan mengapa ini akan berguna.

Bagaimanapun, Anda dapat memberikan kelas Anda pribadi new operator untuk mencapai ini, tetapi perhatikan bahwa ini juga akan mencegah orang menggunakan kelas Anda dalam kontainer standar, karena semua itu mengalokasikan objek mereka yang ada di heap. Itu hanya ide yang buruk untuk melakukan apa yang Anda coba lakukan.


-1
2018-02-20 10:39