标签: private-constructor

如何使用其复制构造函数和复制赋值是私有的对象?

在阅读TCPL时,我遇到了一个问题,正如标题所述,然后'私有'类是:

class Unique_handle {
private:
    Unique_handle& operator=(const Unique_handle &rhs);
    Unique_handle(const Unique_handle &rhs);
public:
    //...
};
Run Code Online (Sandbox Code Playgroud)

使用代码是:

struct Y {
    //...
    Unique_handle obj;
};
Run Code Online (Sandbox Code Playgroud)

我想执行这样的操作:

int main()
{
    Y y1;
    Y y2 = y1;
}
Run Code Online (Sandbox Code Playgroud)

虽然,这些代码来自TCPL,但我仍然无法得到解决方案......任何人都可以帮助我,欣赏.

c++ private-constructor private-methods

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

在C++中,我可以将类类型表示为变量吗?

我想从一个我将在运行时确定的类调用静态方法,但我知道它是给定类的子类.所以我要说我有这些课程

class super {
    public:
    super();
    static super *loadMe (ifstream &is);
}

class subA : public super {
   public:
   subA();
   static super *loadMe (ifstream &is);
}

class subB : public super {
   public:
   static super *loadMe (ifstream &is);
   private:
   subB();
}
Run Code Online (Sandbox Code Playgroud)

让我们说我想在运行时(根据文件中的内容)确定是否要加载subA或subB.我可以这样做的一种方法是使用一个空对象来调用该方法

super getLoadType (ifstream &is) { if(complicatedFunctionOfIs(is)) return subA(); return subB()}

super *newObj = getLoadType(is).loadMe(is);
Run Code Online (Sandbox Code Playgroud)

但是我把subB的无参数构造函数设为私有,所以我不能在这里做.但我实际上并不需要超级对象,只需要超类的类类型.那么有没有办法将其表示为变量?

编辑:我知道在这种情况下,我可以返回一个函数指针,但我正在考虑更复杂的例子,可能需要调用多个静态函数.

c++ static-methods class private-constructor

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

对工厂方法使用私有构造函数?

假设我正在构建一个不可变的 Yahtzee 记分卡类:

public final class Scorecard {

    private Map<Category, Integer> scorecard = new HashMap<Category, Integer>();

    public Scorecard() {
        // Instantiates a new empty scorecard
    }

    private Scorecard(Map<Category, Integer> scorecard) {
        this.scorecard = scorecard;
    }

    public Scorecard withScore(Category category, int[] roll) {
        newScorecard = new HashMap<Category, Integer>(scorecard); // Pretend that this is a deep-copy
        newScorecard.put(category, calculateScoreFromRoll(roll));
        return new Scorecard(newScorecard);
    }

    public int getScore(Category category) {
        return scorecard.get(category);
    }

}
Run Code Online (Sandbox Code Playgroud)

基本上我不想暴露类的内部结构。如果我没有私有构造函数,那么我将需要使用带有私有构造函数的公共构造函数Map(并且我也可能会丢失该withScore()方法)以便进行评分。但这是一种有效的工厂方法吗?

java immutability private-constructor

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

C++中的私有构造函数

我是C++的新手,我正在尝试使用LinkedListIterator实用程序类编写LinkedList类,如下所示.(我只列出了与问题相关的代码部分).我已将LinkedListIterator构造函数创建为私有.

现在,当我在main()中有这两行时,

    LinkedListIterator iter = list->begin(); <<== No compilation error 
    LinkedListIterator iter2;  <<==== compilation error.         
Run Code Online (Sandbox Code Playgroud)

我得到第二行的编译错误,这是默认构造函数是私有的.但是,我不明白为什么第一行没有编译错误?为什么?什么叫代码的第一行?私有构造函数或复制构造函数或赋值运算符?

class LinkedListIterator {
    public:
       bool operator== (LinkedListIterator i) const;
       bool operator!= (LinkedListIterator i) const;
       void operator++ (); // Go to the next element
       int& operator* (); // Access the current element
       inline Node* hasnext();
       inline Node* next();

    private:
       LinkedListIterator(Node* p); <<==== Private constructor
       LinkedListIterator();        <<==== Private constructor
       Node* p_;
       friend class LinkedList;//LinkedList can construct a LinkedListIterator

};

....

inline LinkedListIterator::LinkedListIterator(Node* p)
: p_(p) …
Run Code Online (Sandbox Code Playgroud)

c++ constructor private-constructor

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

Json.NET-如何使用内部构造函数序列化外部类?

我需要序列化一个不能更改其源代码的类(将其视为事实),并且它来自不同的程序集。它只有一个构造函数

public class MyObject
{
    string _s;
    int _i;
    internal MyObject(string s, int i)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

JsonConvert.SerializeObject(object)因此当然会失败。我想知道是否有一种方法可以使用Json.NET来序列化此类,而不必向其添加代码甚至标记。

c# oop serialization json.net private-constructor

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

为什么我能够在子类中继承和调用私有构造函数?

我读到,从构造函数是私有的类创建子类是不可能的,但奇怪的是我能够做到这一点,这个代码片段还有更多内容吗?

请有人提供易于理解和满意的解释.

public class app {

    public static void main(String[] args) {
        app ref = new app();
        myInheritedClass myVal = ref.new myInheritedClass(10);
        myVal.show();

    }

    int myValue = 100;

    class myClass {
        int data;

        private myClass(int data) {
            this.data = data;
        }

    }

    class myInheritedClass extends myClass {
        public myInheritedClass(int data) {
            super(data);
        }

        public void show() {
            System.out.println(data);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我在https://www.compilejava.net/上运行了这个片段,输出为10.

java subclass private-constructor

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

为什么私有构造函数会阻止对象创建 C++

我一直读到私有构造函数会阻止对象创建。我在单例模式中使用过它们,我知道如何在使用私有构造函数(使用静态方法等)时创建对象。我知道构造函数用于对象的初始化。

但我不明白是什么让私有构造函数阻止对象创建。如果我的对象没有被初始化怎么办。我的意思是它应该扔一些垃圾但为什么它会限制?

我已经检查了 stackoverflow 中的所有现有答案,但我没有得到确切的概念。

c++ private-constructor

2
推荐指数
3
解决办法
2678
查看次数

make_unique 不会编译用于创建单例实例

全部,

我正在使用 C++14,并且正在制作一个或多或少的标准单例。我正在使用最新的 Visual Studio 2017。此代码有效:

#include <memory>
class A
{
public:
  static A& getInstance()
  {
    if (instance == nullptr)
      instance = std::unique_ptr<A>(new A());
    return *instance;
  }

private:
  A() {}
  static std::unique_ptr<A> instance;
};
std::unique_ptr<A> A::instance = nullptr;
Run Code Online (Sandbox Code Playgroud)

但是,当我将单例实例的创建更改为:

instance = std::make_unique<A>();
Run Code Online (Sandbox Code Playgroud)

我在尝试访问私有成员时收到编译错误:

Error   C2248   'A::A': cannot access private member declared in class 'A'      
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.14.26428\include\memory   2510    
Run Code Online (Sandbox Code Playgroud)

这对我来说感觉像是一个错误,因为这两种形式在功能上应该是相同的?想法?

c++ singleton private-constructor unique-ptr c++14

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

c#抽象类中私有构造函数的作用是什么?

我在面试中面临以下问题。

Q1.抽象类中可以有私有构造函数吗?

答案-是的,我给了一个答案,我们可以有那么他再次问为什么,什么是使用私有构造的。我无法回答这个交叉问题。有人可以解释一下吗?实际上在 c# 中会有很大帮助。

c# private-constructor

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

为什么私有构造函数在 case 类中仍然可见?

我想将构造函数及其字段隐藏在一个类中,并且只使用伴随对象创建实例,但我无法实现。我有 Scala 2.13.3,它基于 java 8。这是一个代码示例:

斯卡拉

package X

object A {
  def apply(x: Int): A = A(Seq(x))
}

case class A private(private val s: Seq[Int])
Run Code Online (Sandbox Code Playgroud)

甜菜

package Y

import X.A

class B {
  val b = A(Seq.empty)
}
Run Code Online (Sandbox Code Playgroud)

虽然我只想让apply(x:Int)这段代码可见,但编译后的私有构造函数也是可见的。如何更改此代码以按预期工作?

scala access-modifiers private-constructor case-class companion-object

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

c ++:私有构造函数意味着在头文件中没有该类对象的定义?

还有一个问题,转到我!...无论如何,我有两个私有构造函数和静态函数的类来返回该类的实例.一切都很好,我有一个main.cpp文件,我设法得到我的gameState对象指针,通过这样做:

gameState *state = gameState::Instance();
Run Code Online (Sandbox Code Playgroud)

但现在我似乎遇到了问题.为方便起见,我希望gameState实例和actionHandler实例都保留指向对方的副本.所以我试图在彼此的头文件中包含:

gameState *state;
Run Code Online (Sandbox Code Playgroud)

actionHandler *handler;
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用......我得到"错误C2143:语法错误:缺少';' 在这两行之前的'*'"错误之前......如果该类有私有构造函数,你能否在头文件中定义某个classe的变量?或者是其他问题?或许是因为指向teh实例的指针存储为静态成员?

编辑:谢谢你们!令人惊讶的是我最近几天获得的c ++知识量很多......真棒!

c++ static-members private-constructor

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

私有构造函数的通用对象

这是我的问题.我想有一个私有构造函数的类,可以使用多个静态方法创建,就像Box.createHorizontalBox().它变得复杂的地方是这个类使用泛型.

请告诉我如何正确地做到这一点:

private WorkFlow(int _arrowSize) {
  this.arrowSize = _arrowSize;
  this.elements = new ArrayList<T>();
}

public static WorkFlow<T> createHorizontalWorkFlow<T>(int _arrowSize) {
  WorkFlow<T> workFlow = new WorkFlow<T>(_arrowSize);
  workFlow.vertical = false;
  return workFlow;
}
Run Code Online (Sandbox Code Playgroud)

这不起作用:Eclipse强调了intfrom createHorizontalWorkFlow<T>(int _arrowSize)并给了我错误Syntax error on token(s), misplaced construct(s)

java generics private-constructor

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

如何在C++中正确地向下转换

出于任何原因,我有一个静态方法创建的对象,它调用私有构造函数.(它不是单身人士)

我想创建一个新对象派生自第一个,它有更多的成员和函数.
但这是有问题的,因为静态方法返回一个firstObject*对象,因此使用向下转换的创建secondObject*会使内存溢出.

我该怎么办?我可以访问第一个对象的代码,但是无法更改其构造函数(如果我更改它,我将不得不更改一个巨大的编写代码).

编辑:

感谢所有响应者.我可以更改要保护的构造函数.

c++ memory inheritance casting private-constructor

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