Có bất cứ sử dụng cho một class để chứa chỉ (theo mặc định) các thành viên private trong c ++?


0 Phiếu
Đã hỏi 25/5/2016 bởi Yuste_it (720 điểm)
Các thành viên của class một là bởi mặc định private trong c + +. Do đó, tôi tự hỏi liệu có bất kỳ sử dụng có thể tạo ra một class có tất cả các thành viên (các biến và hàm) thiết lập mặc định để riêng. Nói cách khác, không có tồn tại bất kỳ định nghĩa có ý nghĩa class mà không có bất kỳ từ khóa public, protected hoặc private?

3 Câu trả lời

0 Phiếu
Đã trả lời 04/6/2016 bởi Tbv_3796 (540 điểm)
 
Câu trả lời hay nhất
Thẻ lập. Nó được sử dụng trong library tiêu chuẩn cho iterator mục tags , để lựa chọn thuật toán có thể hiệu quả hơn với một số loại iterator. Ví dụ, std::distance có thể thực hiện một cái gì đó như thế này: (trong thực tế nó được thực hiện gần như chính xác như thế này trong gnu libstdc ++, nhưng tôi đã sửa đổi nó một chút để cải thiện dễ đọc)
template<typename Iterator>
typename iterator_traits<Iterator>::difference_type
distance(Iterator first, Iterator last)
{
      return __distance(first, last,
             typename iterator_traits<Iterator>::iterator_category());
}
__distance ở đâu một function đó là quá tải để hoạt động hiệu quả hơn cho std::random_access_iterator_tag (đó là một struct trống rỗng, nhưng có thể chỉ là một cách dễ dàng một lớp học) , chỉ đơn giản bằng cách sử dụng last - first thay vì hành vi mặc định của đếm bao nhiêu increments nó cần để có được first để last.
Đã bình luận 05/6/2016 bởi Abg_8468_cai (100 điểm)
are you referring also to C-tor and d-tor being private? if yes, i don't see any design pattern that would make use of such a class. That class interface is fully hidden so no one can ever create an object out of it
Đã bình luận 06/6/2016 bởi Sbe_All (100 điểm)
@ NirMH một 'người bạn' lớp/chức năng có thể làm điều đó.
0 Phiếu
Đã trả lời 04/6/2016 bởi Erasure (720 điểm)
Không, đó là không có ý nghĩa trong việc tạo ra một class mà không public member variable và/hoặc chức năng, vì sẽ không có một cách để access bất cứ điều gì trong lớp học. Ngay cả khi tuyên bố không rõ ràng, inheritance là private là tốt. Chắc chắn, bạn có thể sử dụng friend như đề xuất, nhưng nó sẽ tạo ra convolution không cần thiết.
mặt khác, nếu bạn sử dụng struct và không class để xác định một lớp, sau đó bạn nhận được tất cả mọi thứ công cộng. Đó có thể làm cho tinh thần. Ví dụ:
struct MyHwMap {
  unsigned int field1 : 16;
  unsigned int field2 : 8;
  unsigned int fieldA : 24;
};
+1 Phiếu
Đã trả lời 04/6/2016 bởi Pbz_Sane (256,910 điểm)
Ứng dụng rộng resource mua lại?
#include <iostream>
class C {
    C() {
        std::cout << "Acquire resource" << std::endl;
    }

    ~C() {
        std::cout << "Release resource" << std::endl;
    }
    static C c;
};

C C::c;
int main() {
    return 0;
}
như đã nêu trong bình luận dưới đây, tôi có tôi nhớ một ứng dụng công nghiệp đã phải "khóa" một số thiết bị phần cứng trong khi program đang chạy. Nhưng có thể có thể tìm thấy một sử dụng khác cho điều này như là, sau khi tất cả, nó là chỉ một số "nhâ" case hoặc RAII .
là về việc sử dụng các phương pháp "riêng tư" bên ngoài khối tuyên bố: tôi sử dụng một member static ở đây. Vì vậy, nó là tuyên bố tại một điểm nơi mà thành viên private có thể truy cập . Anh không giới hạn đối với nhà xây dựng/hủy. Bạn có thể thậm chí cả các phương pháp sử dụng một static (ab) và sau đó gọi private instance phương pháp bằng cách sử dụng một thông thạo interface :
class C {
    C() { std::cout << "Ctor " << this << std::endl; }
    ~C() { std::cout << "Dtor" << this << std::endl; }
    static C* init(const char* mode) {
        static C theC;
        std::cout << "Init " << mode << std::endl;
        return &theC;
    }
    C* doThis() {
        std::cout << "doThis " << std::endl;
        return this;
    }
    C* doThat() {
        std::cout << "doThat " << std::endl;
        return this;
    }
    static C *c;
};

C *C::c = C::init("XYZ")
            ->doThis()
            ->doThat();
int main() {
    std::cout << "Running " << std::endl;
    return 0;
}
code đó là vẫn còn hợp lệ (như tất cả C thành viên có thể truy cập tại điểm tuyên bố của C::c). Và sẽ sản xuất một cái gì đó như thế:
Ctor 0x601430
Init XYZ
doThis 
doThat 
Running 
Dtor0x601430
Đã bình luận 06/6/2016 bởi Ohg_But (100 điểm)
Tại sao bạn giả định rằng phải có một lớp học? "riêng mặc định" không ngụ ý rằng * all * thành viên nên có riêng, chỉ đơn thuần là riêng tư nên, Vâng, mặc định.

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...